Tau ReSpeaker Setup V01
Dependencies: MbedJSONValue mbed
Fork of TAU_ReSpeaker_DSP_Test by
filters.h@3:48258b86e182, 2018-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |