Tau ReSpeaker Setup V01

Dependencies:   MbedJSONValue mbed

Fork of TAU_ReSpeaker_DSP_Test by Yossi_Students

Committer:
Arkadi
Date:
Mon Feb 19 11:50:39 2018 +0000
Revision:
3:48258b86e182
Parent:
1:574b54755983
Child:
4:59319802012b
added faster selected operation mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Arkadi 1:574b54755983 1
Arkadi 1:574b54755983 2 // Filter variables:
Arkadi 1:574b54755983 3 /*
Arkadi 1:574b54755983 4 butter FILTER DESIGN, 23-Nov-2016 09:14:52, 2 sections, for sampling frequency 744000.0 Hz
Arkadi 1:574b54755983 5 Filter Order 4, Cut Off Frequency 20000 Hz
Arkadi 1:574b54755983 6 */
Arkadi 1:574b54755983 7
Arkadi 1:574b54755983 8 ///////////////////////////////
Arkadi 1:574b54755983 9 // filter variables: //
Arkadi 1:574b54755983 10 ///////////////////////////////
Arkadi 1:574b54755983 11
Arkadi 1:574b54755983 12 float SOSMatHP[2][6] = { // 25khz cutoff at 920 kHz sample rate // closer to 30kHz when io toggle switched off.
Arkadi 1:574b54755983 13 1.000000, -2.000000, 1.000000, 1.000000, -1.706510, 0.731145,
Arkadi 1:574b54755983 14 1.000000, -2.000000, 1.000000, 1.000000, -1.852377, 0.879117
Arkadi 1:574b54755983 15 };
Arkadi 1:574b54755983 16 float GscaleHP = 0.801724;
Arkadi 1:574b54755983 17
Arkadi 1:574b54755983 18 // second-order sections filter variables - upto 8 sections
Arkadi 1:574b54755983 19 #define MAX_SECTION_NUMBER 8
Arkadi 1:574b54755983 20 int NumSectionsHP = sizeof(SOSMatHP)/sizeof(float)/6;
Arkadi 1:574b54755983 21
Arkadi 1:574b54755983 22 // convertions
Arkadi 1:574b54755983 23 float ADC2Float=(2.0f/4095.0f); //ADCvalue*(2/0xFFF)-1.0f // 12 bits range
Arkadi 1:574b54755983 24 float Float2ADC=(4095.0f/2.0f); //(ADCvalue+1.0f)*(0xFFF/2) // 12 bits range
Arkadi 1:574b54755983 25
Arkadi 1:574b54755983 26 ///////////////////////////////
Arkadi 1:574b54755983 27 // available filters: //
Arkadi 1:574b54755983 28 ///////////////////////////////
Arkadi 1:574b54755983 29 // no filter function (output equals input)
Arkadi 1:574b54755983 30 inline void no_filter(void);
Arkadi 1:574b54755983 31 // high pass filter
Arkadi 3:48258b86e182 32 inline void highpass_filter(void);
Arkadi 1:574b54755983 33
Arkadi 1:574b54755983 34
Arkadi 1:574b54755983 35
Arkadi 1:574b54755983 36 ///////////////////////////////
Arkadi 1:574b54755983 37 // Filter Functions: //
Arkadi 1:574b54755983 38 ///////////////////////////////
Arkadi 1:574b54755983 39 // no filter function (output equals input)
Arkadi 1:574b54755983 40 inline void no_filter(void)
Arkadi 1:574b54755983 41 {
Arkadi 1:574b54755983 42 uint32_t ADCValue;
Arkadi 1:574b54755983 43
Arkadi 1:574b54755983 44 // Read ADC input
Arkadi 1:574b54755983 45 ADCValue = hadc1.Instance->DR;
Arkadi 1:574b54755983 46 // Output value using DAC
Arkadi 1:574b54755983 47 *(__IO uint32_t *) Dac_Reg = ADCValue;
Arkadi 1:574b54755983 48
Arkadi 1:574b54755983 49 } // end no filter
Arkadi 1:574b54755983 50
Arkadi 3:48258b86e182 51
Arkadi 1:574b54755983 52 // high pass filter
Arkadi 3:48258b86e182 53 inline void highpass_filter(void)
Arkadi 1:574b54755983 54 {
Arkadi 1:574b54755983 55 float ADCFloat;
Arkadi 1:574b54755983 56 float ADCFloatFiltered;
Arkadi 1:574b54755983 57 uint16_t ADCValueOut;
Arkadi 1:574b54755983 58
Arkadi 1:574b54755983 59 // filter stages variables
Arkadi 1:574b54755983 60 static float CurrInput [MAX_SECTION_NUMBER+1];
Arkadi 1:574b54755983 61 static float LastInput [MAX_SECTION_NUMBER+1];
Arkadi 1:574b54755983 62 static float LLastInput [MAX_SECTION_NUMBER+1];
Arkadi 1:574b54755983 63 // Read ADC input
Arkadi 1:574b54755983 64 ADCFloat=((uint16_t)(hadc1.Instance->DR) * ADC2Float)-1.0f;
Arkadi 1:574b54755983 65
Arkadi 1:574b54755983 66 //////////////////////////////////////////////////////
Arkadi 1:574b54755983 67 // Apply Filter to input //
Arkadi 1:574b54755983 68 //////////////////////////////////////////////////////
Arkadi 1:574b54755983 69
Arkadi 1:574b54755983 70 LLastInput[0] = LastInput[0];
Arkadi 1:574b54755983 71 LastInput[0] = CurrInput[0];
Arkadi 1:574b54755983 72 CurrInput[0] = ADCFloat;
Arkadi 1:574b54755983 73 for (int ii=1; ii <= NumSectionsHP; ii++) {
Arkadi 1:574b54755983 74 LLastInput[ii] = LastInput[ii];
Arkadi 1:574b54755983 75 LastInput[ii] = CurrInput[ii];
Arkadi 1:574b54755983 76 CurrInput[ii] = SOSMatHP[ii-1][0]*CurrInput[ii-1] + SOSMatHP[ii-1][1]*LastInput[ii-1] +
Arkadi 1:574b54755983 77 SOSMatHP[ii-1][2]*LLastInput[ii-1] -
Arkadi 1:574b54755983 78 SOSMatHP[ii-1][4]*LastInput[ii] - SOSMatHP[ii-1][5]*LLastInput[ii];
Arkadi 1:574b54755983 79 ADCFloatFiltered = CurrInput[ii];
Arkadi 1:574b54755983 80 }
Arkadi 1:574b54755983 81
Arkadi 1:574b54755983 82 ADCFloatFiltered = ADCFloatFiltered * GscaleHP;
Arkadi 1:574b54755983 83
Arkadi 1:574b54755983 84 ////////////////////////////
Arkadi 1:574b54755983 85 // Apply Filter to Output //
Arkadi 1:574b54755983 86 ////////////////////////////
Arkadi 1:574b54755983 87
Arkadi 1:574b54755983 88 if (ADCFloatFiltered < -1.0f) {
Arkadi 1:574b54755983 89 ADCValueOut=0; // Min value
Arkadi 1:574b54755983 90 } else if (ADCFloatFiltered > 1.0f) {
Arkadi 1:574b54755983 91 ADCValueOut=0xFFF; // Max value
Arkadi 1:574b54755983 92 } else {
Arkadi 1:574b54755983 93 ADCValueOut=(uint16_t)((ADCFloatFiltered +1.0f) * Float2ADC);
Arkadi 1:574b54755983 94 }
Arkadi 1:574b54755983 95
Arkadi 1:574b54755983 96 // Output value using DAC
Arkadi 1:574b54755983 97 // HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ADCValueOut);
Arkadi 1:574b54755983 98 *(__IO uint32_t *) Dac_Reg = ADCValueOut;
Arkadi 3:48258b86e182 99 //wait_us(1);
Arkadi 1:574b54755983 100
Arkadi 1:574b54755983 101 }