Nikolay Sergeev
/
Nucleo_ADC_microphone
Попытка работы с микрофоном
main.cpp@0:5c44ff47ac5c, 2014-09-27 (annotated)
- Committer:
- Sergeev
- Date:
- Sat Sep 27 15:17:51 2014 +0000
- Revision:
- 0:5c44ff47ac5c
??????? ?????? ? ??????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sergeev | 0:5c44ff47ac5c | 1 | #include "mbed.h" |
Sergeev | 0:5c44ff47ac5c | 2 | |
Sergeev | 0:5c44ff47ac5c | 3 | #define MAX_QUEUE 512 // Indexed from 0 to 511 |
Sergeev | 0:5c44ff47ac5c | 4 | |
Sergeev | 0:5c44ff47ac5c | 5 | AnalogOut speaker(PA_4); // DAC for the speaker/output |
Sergeev | 0:5c44ff47ac5c | 6 | AnalogIn mic(A2); // ADC for the microphone/input |
Sergeev | 0:5c44ff47ac5c | 7 | //AnalogIn pot(p20); // ADC for the pot |
Sergeev | 0:5c44ff47ac5c | 8 | |
Sergeev | 0:5c44ff47ac5c | 9 | int main() |
Sergeev | 0:5c44ff47ac5c | 10 | { |
Sergeev | 0:5c44ff47ac5c | 11 | int queue[MAX_QUEUE]; // Will be a circular buffer |
Sergeev | 0:5c44ff47ac5c | 12 | |
Sergeev | 0:5c44ff47ac5c | 13 | int ii = 0; // Queue write position |
Sergeev | 0:5c44ff47ac5c | 14 | int jj = 0; // Q read position |
Sergeev | 0:5c44ff47ac5c | 15 | int offset = 0; // Delay (number of samples) |
Sergeev | 0:5c44ff47ac5c | 16 | int oo; // The analogue data read or written |
Sergeev | 0:5c44ff47ac5c | 17 | |
Sergeev | 0:5c44ff47ac5c | 18 | while(1) // For ever |
Sergeev | 0:5c44ff47ac5c | 19 | { |
Sergeev | 0:5c44ff47ac5c | 20 | oo = mic.read_u16() - 32767; // Read ADC and remove DC offset |
Sergeev | 0:5c44ff47ac5c | 21 | |
Sergeev | 0:5c44ff47ac5c | 22 | queue[ii] = oo; // Add sample to queue |
Sergeev | 0:5c44ff47ac5c | 23 | |
Sergeev | 0:5c44ff47ac5c | 24 | jj = ii - offset; // Calculate playback position |
Sergeev | 0:5c44ff47ac5c | 25 | |
Sergeev | 0:5c44ff47ac5c | 26 | if (jj < 0) jj = jj + MAX_QUEUE;// If queue pointer is negative, wrap it around. |
Sergeev | 0:5c44ff47ac5c | 27 | |
Sergeev | 0:5c44ff47ac5c | 28 | ii = (ii + 1) % MAX_QUEUE; // Next position in the circular queue |
Sergeev | 0:5c44ff47ac5c | 29 | |
Sergeev | 0:5c44ff47ac5c | 30 | if (ii == 0) // Read the potentiometer |
Sergeev | 0:5c44ff47ac5c | 31 | { |
Sergeev | 0:5c44ff47ac5c | 32 | offset = MAX_QUEUE * 32767 / 65535; // Scale the reading to fit the queue |
Sergeev | 0:5c44ff47ac5c | 33 | |
Sergeev | 0:5c44ff47ac5c | 34 | if (offset >= MAX_QUEUE) offset = MAX_QUEUE - 1; // Limit the upper value |
Sergeev | 0:5c44ff47ac5c | 35 | } |
Sergeev | 0:5c44ff47ac5c | 36 | |
Sergeev | 0:5c44ff47ac5c | 37 | oo = oo + queue[jj]; // Add zero referenced signals: input + delayed_input |
Sergeev | 0:5c44ff47ac5c | 38 | |
Sergeev | 0:5c44ff47ac5c | 39 | oo = oo + 32767; // Restore the DC Offset. |
Sergeev | 0:5c44ff47ac5c | 40 | |
Sergeev | 0:5c44ff47ac5c | 41 | speaker.write_u16(oo); // DAC output |
Sergeev | 0:5c44ff47ac5c | 42 | //printf(); |
Sergeev | 0:5c44ff47ac5c | 43 | |
Sergeev | 0:5c44ff47ac5c | 44 | if (!(ii % 16)) printf("oo = %5d | ii = %5d | jj = %5d | offset = %5d \n\r", oo, ii, jj, offset); |
Sergeev | 0:5c44ff47ac5c | 45 | // FOR DEBUGGING if (!(ii % 16)) printf("oo = %5d | ii = %5d | jj = %5d | offset = %5d \n\r", oo, ii, jj, offset); |
Sergeev | 0:5c44ff47ac5c | 46 | } |
Sergeev | 0:5c44ff47ac5c | 47 | } |