Chirp Signal Generator
Dependencies: mbed
Fork of TAU_ZOOLOG_Playback_Rev1_1 by
main_filter3.cpp@5:65833e8cf4cf, 2017-07-09 (annotated)
- Committer:
- Arkadi
- Date:
- Sun Jul 09 16:11:46 2017 +0000
- Revision:
- 5:65833e8cf4cf
- Parent:
- 4:85dbf3e4d432
- Child:
- 6:f14547e1cc04
Mid Process development
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TauZoolog | 3:25cd717ad782 | 1 | /* |
TauZoolog | 3:25cd717ad782 | 2 | General Biquadratic Digital Filter Implementation |
TauZoolog | 3:25cd717ad782 | 3 | ADC --> Filter --> DAC , Based on NUCLEO - F303RE |
TauZoolog | 3:25cd717ad782 | 4 | |
TauZoolog | 3:25cd717ad782 | 5 | Pinout: |
TauZoolog | 3:25cd717ad782 | 6 | ADC -- PA_0 -- A0 |
TauZoolog | 3:25cd717ad782 | 7 | DAC -- PA_4 -- A2 |
TauZoolog | 3:25cd717ad782 | 8 | |
TauZoolog | 3:25cd717ad782 | 9 | I/O -- PA_5 -- D13 (Status LED, Condition) |
TauZoolog | 3:25cd717ad782 | 10 | I/O -- PA_6 -- D12 (Toggle Pin, Loop Freq) |
TauZoolog | 3:25cd717ad782 | 11 | I/O -- PA_7 -- D11 (General Output Pin ) |
TauZoolog | 3:25cd717ad782 | 12 | |
TauZoolog | 3:25cd717ad782 | 13 | Make sure to use float variables in filter (Not double!). |
TauZoolog | 3:25cd717ad782 | 14 | */ |
TauZoolog | 3:25cd717ad782 | 15 | #include "mbed.h" |
TauZoolog | 3:25cd717ad782 | 16 | #include "config.h" |
TauZoolog | 3:25cd717ad782 | 17 | #include "sounddata.h" |
TauZoolog | 3:25cd717ad782 | 18 | |
Arkadi | 4:85dbf3e4d432 | 19 | #define TEST_OUTPUT_MODE 5 |
TauZoolog | 3:25cd717ad782 | 20 | |
TauZoolog | 3:25cd717ad782 | 21 | // mbed variables, Settings |
TauZoolog | 3:25cd717ad782 | 22 | AnalogIn in(A0); |
TauZoolog | 3:25cd717ad782 | 23 | AnalogOut out(PA_4); |
TauZoolog | 3:25cd717ad782 | 24 | |
Arkadi | 4:85dbf3e4d432 | 25 | // digital pins |
Arkadi | 4:85dbf3e4d432 | 26 | DigitalOut led(LED1); |
Arkadi | 4:85dbf3e4d432 | 27 | DigitalOut outPulse(PA_6); // pulse output on tr connector |
Arkadi | 4:85dbf3e4d432 | 28 | DigitalOut mytoggle(PA_7); |
TauZoolog | 3:25cd717ad782 | 29 | |
TauZoolog | 3:25cd717ad782 | 30 | // User Button as interrupt |
TauZoolog | 3:25cd717ad782 | 31 | InterruptIn mybutton(USER_BUTTON); |
TauZoolog | 3:25cd717ad782 | 32 | |
TauZoolog | 3:25cd717ad782 | 33 | // Serial over USB as input device |
TauZoolog | 3:25cd717ad782 | 34 | Serial pc(SERIAL_TX, SERIAL_RX); |
TauZoolog | 3:25cd717ad782 | 35 | |
TauZoolog | 3:25cd717ad782 | 36 | // ADC/DAC declarations |
TauZoolog | 3:25cd717ad782 | 37 | ADC_HandleTypeDef hadc1; |
TauZoolog | 3:25cd717ad782 | 38 | DAC_HandleTypeDef hdac1; |
TauZoolog | 3:25cd717ad782 | 39 | |
TauZoolog | 3:25cd717ad782 | 40 | // Dac Register for direct method of setting DAC value`s |
TauZoolog | 3:25cd717ad782 | 41 | __IO uint32_t Dac_Reg = 0; |
TauZoolog | 3:25cd717ad782 | 42 | |
TauZoolog | 3:25cd717ad782 | 43 | // Variables |
TauZoolog | 3:25cd717ad782 | 44 | uint16_t ADCValueIn=0; |
TauZoolog | 3:25cd717ad782 | 45 | uint16_t ADCValueOut=0; |
TauZoolog | 3:25cd717ad782 | 46 | float ADCFloat=0; |
TauZoolog | 3:25cd717ad782 | 47 | float ADCFloatFiltered=0; |
TauZoolog | 3:25cd717ad782 | 48 | float OutputADCFloat=0; |
TauZoolog | 3:25cd717ad782 | 49 | float ADC2Float=(2.0f/4095.0f); //ADCvalue*(2/0xFFF)-1.0f // 12 bits range |
TauZoolog | 3:25cd717ad782 | 50 | float Float2ADC=(4095.0f/2.0f); //(ADCvalue+1.0f)*(0xFFF/2) // 12 bits range |
TauZoolog | 3:25cd717ad782 | 51 | // float ADC2Float= 1.0; |
TauZoolog | 3:25cd717ad782 | 52 | // float Float2ADC= 1.0; |
TauZoolog | 3:25cd717ad782 | 53 | uint16_t ADCValueMax = 0; |
TauZoolog | 3:25cd717ad782 | 54 | uint16_t ADCValueMin = 0xfff; |
TauZoolog | 3:25cd717ad782 | 55 | |
TauZoolog | 3:25cd717ad782 | 56 | // Definitions for software developer |
TauZoolog | 3:25cd717ad782 | 57 | #define NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT ((long)300000) // 0 - not check keyboard input |
TauZoolog | 3:25cd717ad782 | 58 | #define SAMPLING_FREQUENCY_DELAY 2 // microseconds |
TauZoolog | 3:25cd717ad782 | 59 | #define CONSTANT_SIGNAL_LEVEL_FOR_TEST 0.2 |
TauZoolog | 3:25cd717ad782 | 60 | #define NUM_OF_CYCLES_BACK_TO_NORMAL 0 // User can play with this. Hysteresis, 0 - no hysteresis |
TauZoolog | 3:25cd717ad782 | 61 | |
Arkadi | 4:85dbf3e4d432 | 62 | // global variables |
TauZoolog | 3:25cd717ad782 | 63 | float scale_for_predefined_output = (float)SCALE_FOR_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 64 | int sampling_frequency_delay = SAMPLING_FREQUENCY_DELAY; |
TauZoolog | 3:25cd717ad782 | 65 | int delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION; |
TauZoolog | 3:25cd717ad782 | 66 | bool use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 67 | int num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING; |
TauZoolog | 3:25cd717ad782 | 68 | |
TauZoolog | 3:25cd717ad782 | 69 | int startPredefinedOutput = 0; |
TauZoolog | 3:25cd717ad782 | 70 | int num_threshold_crossing = 0; |
TauZoolog | 3:25cd717ad782 | 71 | int num_back_to_normal = 0; |
TauZoolog | 3:25cd717ad782 | 72 | int signal_low_threshold = SIGNAL_LOW_THRESHOD; |
TauZoolog | 3:25cd717ad782 | 73 | |
TauZoolog | 3:25cd717ad782 | 74 | int UserButtonPressed; |
TauZoolog | 3:25cd717ad782 | 75 | long NumCycles; |
TauZoolog | 3:25cd717ad782 | 76 | |
TauZoolog | 3:25cd717ad782 | 77 | // second-order sections filter variables - upto 8 sections |
TauZoolog | 3:25cd717ad782 | 78 | #define MAX_SECTION_NUMBER 8 |
TauZoolog | 3:25cd717ad782 | 79 | int NumSections = sizeof(SOSMat)/sizeof(float)/6; |
TauZoolog | 3:25cd717ad782 | 80 | int NumSectionsHP = sizeof(SOSMatHP)/sizeof(float)/6; |
TauZoolog | 3:25cd717ad782 | 81 | |
TauZoolog | 3:25cd717ad782 | 82 | // Inputs |
TauZoolog | 3:25cd717ad782 | 83 | float CurrInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 84 | float LastInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 85 | float LLastInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 86 | |
TauZoolog | 3:25cd717ad782 | 87 | float scaled_sounddata[AMOUNT_OF_SIGNIFICANT_SAMPLES]; |
TauZoolog | 3:25cd717ad782 | 88 | char FilterType[5][32]; |
TauZoolog | 3:25cd717ad782 | 89 | int LoopCount = 0; |
TauZoolog | 3:25cd717ad782 | 90 | |
Arkadi | 4:85dbf3e4d432 | 91 | // trigger_pass variables |
Arkadi | 4:85dbf3e4d432 | 92 | float triggThresholdValue=TRIGGER_THRESHOLD_VALUE; |
Arkadi | 5:65833e8cf4cf | 93 | // number of samples to count |
Arkadi | 5:65833e8cf4cf | 94 | float sample_length=SAMPLE_LENGTH*(SampleRate/1000.0f); // compansate number of cycles based on sample rate |
Arkadi | 5:65833e8cf4cf | 95 | float quiet_length=QUIET_LENGTH*(SampleRate/1000.0f); // compansate number of cycles based on sample rate |
Arkadi | 5:65833e8cf4cf | 96 | bool trigger_HPF=TRIGGER_HPF; |
Arkadi | 5:65833e8cf4cf | 97 | |
Arkadi | 4:85dbf3e4d432 | 98 | |
Arkadi | 4:85dbf3e4d432 | 99 | // high pass variables |
Arkadi | 4:85dbf3e4d432 | 100 | // high pass |
Arkadi | 4:85dbf3e4d432 | 101 | // tau=RC=1/2pif |
Arkadi | 4:85dbf3e4d432 | 102 | // α := RC / (RC + dt) :=Tau/(Tau+dt) |
Arkadi | 4:85dbf3e4d432 | 103 | // y[0] := x[0] |
Arkadi | 4:85dbf3e4d432 | 104 | // y[i] := α * y[i-1] + α * (x[i] - x[i-1]) |
Arkadi | 4:85dbf3e4d432 | 105 | // AHPF=ALPHA |
Arkadi | 4:85dbf3e4d432 | 106 | |
Arkadi | 4:85dbf3e4d432 | 107 | float Tau=TAU_AHPF; // time constat of the filter, (1khz -> 0.001 second) |
Arkadi | 4:85dbf3e4d432 | 108 | float AHPF=Tau/(Tau+1.0f/SampleRate); |
Arkadi | 4:85dbf3e4d432 | 109 | float LastY=0; |
Arkadi | 4:85dbf3e4d432 | 110 | float CurY=0; |
Arkadi | 4:85dbf3e4d432 | 111 | float LastU=0; |
Arkadi | 4:85dbf3e4d432 | 112 | float CurU=0; |
Arkadi | 4:85dbf3e4d432 | 113 | |
Arkadi | 4:85dbf3e4d432 | 114 | |
TauZoolog | 3:25cd717ad782 | 115 | inline void NOP() |
TauZoolog | 3:25cd717ad782 | 116 | { |
TauZoolog | 3:25cd717ad782 | 117 | __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess |
TauZoolog | 3:25cd717ad782 | 118 | } |
TauZoolog | 3:25cd717ad782 | 119 | |
TauZoolog | 3:25cd717ad782 | 120 | // User Button Interrupt Service Routine (ISR) |
TauZoolog | 3:25cd717ad782 | 121 | void pressed() |
TauZoolog | 3:25cd717ad782 | 122 | { |
TauZoolog | 3:25cd717ad782 | 123 | UserButtonPressed = 0; |
TauZoolog | 3:25cd717ad782 | 124 | } |
TauZoolog | 3:25cd717ad782 | 125 | |
TauZoolog | 3:25cd717ad782 | 126 | int checkKeyboardInput(void) |
TauZoolog | 3:25cd717ad782 | 127 | { |
TauZoolog | 3:25cd717ad782 | 128 | if (pc.readable()) |
TauZoolog | 3:25cd717ad782 | 129 | return 0; // means has input |
TauZoolog | 3:25cd717ad782 | 130 | else |
TauZoolog | 3:25cd717ad782 | 131 | return 1; // means no input |
TauZoolog | 3:25cd717ad782 | 132 | } |
TauZoolog | 3:25cd717ad782 | 133 | |
TauZoolog | 3:25cd717ad782 | 134 | #include "adc_init.h" |
TauZoolog | 3:25cd717ad782 | 135 | |
TauZoolog | 3:25cd717ad782 | 136 | #include "iirlpnorm_filter.h" |
TauZoolog | 3:25cd717ad782 | 137 | |
TauZoolog | 3:25cd717ad782 | 138 | #include "high_path_filter.h" |
TauZoolog | 3:25cd717ad782 | 139 | |
TauZoolog | 3:25cd717ad782 | 140 | #include "no_filter.h" |
TauZoolog | 3:25cd717ad782 | 141 | |
TauZoolog | 3:25cd717ad782 | 142 | #include "predefined_output.h" |
TauZoolog | 3:25cd717ad782 | 143 | |
Arkadi | 4:85dbf3e4d432 | 144 | #include "triggered_pass.h" |
Arkadi | 4:85dbf3e4d432 | 145 | |
TauZoolog | 3:25cd717ad782 | 146 | void print_parameters() |
TauZoolog | 3:25cd717ad782 | 147 | { |
Arkadi | 5:65833e8cf4cf | 148 | printf("\r\n%s Digital Filter.\r\nSTART MAIN LOOP, use mode %d, loop #%d, number of sections: %d\r\n", |
TauZoolog | 3:25cd717ad782 | 149 | FilterType[UseFilterMode], UseFilterMode, LoopCount, |
TauZoolog | 3:25cd717ad782 | 150 | (UseFilterMode == IIRLPNORM_FILTER_MODE) ? NumSections : NumSectionsHP); |
TauZoolog | 3:25cd717ad782 | 151 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 152 | printf("Signal threshould: %d\r\nSignal scale: %5.2f\r\nNumber of cycles to detect threshold crossing: %d\r\nDelay after signal in microseconds: %d\r\nUse filter: %s\r\n", |
TauZoolog | 3:25cd717ad782 | 153 | signal_low_threshold, scale_for_predefined_output, num_of_cycles_to_detect_threshold_crossing, delay_after_signal_transmission, |
TauZoolog | 3:25cd717ad782 | 154 | use_filter_with_predefined_output ? "Y" : "N"); |
TauZoolog | 3:25cd717ad782 | 155 | } |
TauZoolog | 3:25cd717ad782 | 156 | } |
TauZoolog | 3:25cd717ad782 | 157 | |
TauZoolog | 3:25cd717ad782 | 158 | // Main procedure |
Arkadi | 4:85dbf3e4d432 | 159 | int main() |
Arkadi | 4:85dbf3e4d432 | 160 | { |
Arkadi | 4:85dbf3e4d432 | 161 | char command[64]; |
Arkadi | 4:85dbf3e4d432 | 162 | int isInputNotValid; |
Arkadi | 4:85dbf3e4d432 | 163 | int k; |
Arkadi | 4:85dbf3e4d432 | 164 | bool isSignalClipped = false; |
TauZoolog | 3:25cd717ad782 | 165 | |
Arkadi | 4:85dbf3e4d432 | 166 | strcpy(FilterType[0], "IIRLPNORM filter"); |
Arkadi | 4:85dbf3e4d432 | 167 | strcpy(FilterType[1], "High Pass filter"); |
Arkadi | 4:85dbf3e4d432 | 168 | strcpy(FilterType[2], "No filter"); |
Arkadi | 4:85dbf3e4d432 | 169 | strcpy(FilterType[3], "Predefined Output"); |
Arkadi | 4:85dbf3e4d432 | 170 | strcpy(FilterType[4], "Test Output"); |
TauZoolog | 3:25cd717ad782 | 171 | |
Arkadi | 4:85dbf3e4d432 | 172 | ADC1_Init(); |
Arkadi | 4:85dbf3e4d432 | 173 | DAC1_Init(); |
TauZoolog | 3:25cd717ad782 | 174 | |
Arkadi | 4:85dbf3e4d432 | 175 | HAL_ADC_Start(&hadc1); |
Arkadi | 4:85dbf3e4d432 | 176 | HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); |
TauZoolog | 3:25cd717ad782 | 177 | |
Arkadi | 4:85dbf3e4d432 | 178 | // define Dac Register for direct method of setting DAC value`s |
Arkadi | 4:85dbf3e4d432 | 179 | Dac_Reg = (uint32_t) (hdac1.Instance); |
Arkadi | 4:85dbf3e4d432 | 180 | Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R); |
TauZoolog | 3:25cd717ad782 | 181 | |
Arkadi | 4:85dbf3e4d432 | 182 | typedef void(*functionPtr)(void); |
Arkadi | 4:85dbf3e4d432 | 183 | functionPtr FilterFunction; |
Arkadi | 4:85dbf3e4d432 | 184 | |
Arkadi | 4:85dbf3e4d432 | 185 | // Assign ISR |
Arkadi | 4:85dbf3e4d432 | 186 | mybutton.fall(&pressed); |
Arkadi | 4:85dbf3e4d432 | 187 | |
Arkadi | 4:85dbf3e4d432 | 188 | LoopCount++; |
Arkadi | 4:85dbf3e4d432 | 189 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 190 | |
Arkadi | 4:85dbf3e4d432 | 191 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 192 | // Prepare scaled sound data |
Arkadi | 4:85dbf3e4d432 | 193 | isSignalClipped = false; |
Arkadi | 4:85dbf3e4d432 | 194 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
Arkadi | 4:85dbf3e4d432 | 195 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
Arkadi | 4:85dbf3e4d432 | 196 | if (scaled_sounddata[k] < (float)-1.0) { |
Arkadi | 4:85dbf3e4d432 | 197 | scaled_sounddata[k] = (float)-1.0; |
Arkadi | 4:85dbf3e4d432 | 198 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 199 | } |
Arkadi | 4:85dbf3e4d432 | 200 | if (scaled_sounddata[k] > (float)1.0) { |
Arkadi | 4:85dbf3e4d432 | 201 | scaled_sounddata[k] = (float)1.0; |
Arkadi | 4:85dbf3e4d432 | 202 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 203 | } |
TauZoolog | 3:25cd717ad782 | 204 | } |
Arkadi | 4:85dbf3e4d432 | 205 | } |
TauZoolog | 3:25cd717ad782 | 206 | |
Arkadi | 4:85dbf3e4d432 | 207 | // Infinite loop |
Arkadi | 4:85dbf3e4d432 | 208 | while(true) { |
Arkadi | 4:85dbf3e4d432 | 209 | switch (UseFilterMode) { |
Arkadi | 4:85dbf3e4d432 | 210 | case IIRLPNORM_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 211 | FilterFunction = iirlpnorm_filter; |
Arkadi | 5:65833e8cf4cf | 212 | printf("Running IIRLPNORM filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 213 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 214 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 215 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 216 | break; |
Arkadi | 4:85dbf3e4d432 | 217 | // end of case IIRLPNORM_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 218 | |
Arkadi | 4:85dbf3e4d432 | 219 | case HIGH_PASS_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 220 | FilterFunction = highpath_filter; |
Arkadi | 5:65833e8cf4cf | 221 | printf("Running High Path filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 222 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 223 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 224 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 225 | break; |
Arkadi | 4:85dbf3e4d432 | 226 | // end of case HIGH_PASS_FILTER_MODE |
Arkadi | 4:85dbf3e4d432 | 227 | |
Arkadi | 4:85dbf3e4d432 | 228 | case PREDEFINED_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 229 | FilterFunction = predefined_output; |
Arkadi | 5:65833e8cf4cf | 230 | printf("Running Predefined Output\r\n"); |
Arkadi | 4:85dbf3e4d432 | 231 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 232 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 233 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 234 | num_threshold_crossing = 0; |
Arkadi | 4:85dbf3e4d432 | 235 | startPredefinedOutput = 0; |
Arkadi | 4:85dbf3e4d432 | 236 | num_back_to_normal = 0; |
Arkadi | 4:85dbf3e4d432 | 237 | break; |
Arkadi | 4:85dbf3e4d432 | 238 | // end of case PREDEFINED_OUTPUT_MODE |
Arkadi | 4:85dbf3e4d432 | 239 | |
Arkadi | 4:85dbf3e4d432 | 240 | case NO_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 241 | FilterFunction = no_filter; |
Arkadi | 5:65833e8cf4cf | 242 | printf("Running No filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 243 | break; |
Arkadi | 4:85dbf3e4d432 | 244 | // end of case NO_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 245 | |
Arkadi | 4:85dbf3e4d432 | 246 | case TRIGGERED_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 247 | FilterFunction = triggered_pass; |
Arkadi | 5:65833e8cf4cf | 248 | printf("Running Triggered Mode\r\n"); |
Arkadi | 4:85dbf3e4d432 | 249 | break; |
Arkadi | 4:85dbf3e4d432 | 250 | // end of case Triggered Mode |
Arkadi | 4:85dbf3e4d432 | 251 | |
Arkadi | 4:85dbf3e4d432 | 252 | case TEST_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 253 | FilterFunction = test_output; |
Arkadi | 5:65833e8cf4cf | 254 | printf("Running test output\r\n"); |
Arkadi | 4:85dbf3e4d432 | 255 | break; |
Arkadi | 4:85dbf3e4d432 | 256 | // end of case TEST_OUTPUT_MODE |
Arkadi | 4:85dbf3e4d432 | 257 | |
Arkadi | 4:85dbf3e4d432 | 258 | default: |
Arkadi | 4:85dbf3e4d432 | 259 | printf("Wrong User Filter Mode"); |
Arkadi | 4:85dbf3e4d432 | 260 | // Default - no filter |
Arkadi | 4:85dbf3e4d432 | 261 | FilterFunction = no_filter; |
Arkadi | 5:65833e8cf4cf | 262 | printf("No filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 263 | break; |
Arkadi | 4:85dbf3e4d432 | 264 | |
Arkadi | 4:85dbf3e4d432 | 265 | } // end of switch (UserFilterMode) |
TauZoolog | 3:25cd717ad782 | 266 | |
Arkadi | 4:85dbf3e4d432 | 267 | UserButtonPressed = 1; |
Arkadi | 4:85dbf3e4d432 | 268 | NumCycles = 0; |
Arkadi | 4:85dbf3e4d432 | 269 | ADCValueMax = 0; |
Arkadi | 4:85dbf3e4d432 | 270 | ADCValueMin = 0xfff; |
TauZoolog | 3:25cd717ad782 | 271 | |
Arkadi | 4:85dbf3e4d432 | 272 | // ==================================================== |
Arkadi | 4:85dbf3e4d432 | 273 | // Start signal processing |
Arkadi | 4:85dbf3e4d432 | 274 | while(UserButtonPressed) { |
Arkadi | 4:85dbf3e4d432 | 275 | FilterFunction(); |
Arkadi | 4:85dbf3e4d432 | 276 | NumCycles++; |
Arkadi | 4:85dbf3e4d432 | 277 | // Check keyboard input each NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT cycles |
Arkadi | 4:85dbf3e4d432 | 278 | if((NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT > 0) && (NumCycles % NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT == 0)) { |
Arkadi | 4:85dbf3e4d432 | 279 | // printf("Check keyboard input. Cycle: %d\n", NumCycles); |
Arkadi | 4:85dbf3e4d432 | 280 | UserButtonPressed = checkKeyboardInput(); |
Arkadi | 4:85dbf3e4d432 | 281 | } |
Arkadi | 4:85dbf3e4d432 | 282 | } // end of while(UserButtonPressed) |
Arkadi | 4:85dbf3e4d432 | 283 | // End of signal processing |
Arkadi | 4:85dbf3e4d432 | 284 | // ==================================================== |
Arkadi | 4:85dbf3e4d432 | 285 | |
Arkadi | 4:85dbf3e4d432 | 286 | // User button pressed |
Arkadi | 4:85dbf3e4d432 | 287 | // Main loop working with ADC/DAC is stopped |
Arkadi | 4:85dbf3e4d432 | 288 | // Here should be functionality which should be done before start another loop with ADC/DAC |
Arkadi | 5:65833e8cf4cf | 289 | printf("\nKeyboard key or User button pressed! Exit from main loop.\r\n"); |
Arkadi | 4:85dbf3e4d432 | 290 | |
Arkadi | 4:85dbf3e4d432 | 291 | // Init filter variables |
Arkadi | 4:85dbf3e4d432 | 292 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 293 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 294 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 295 | |
Arkadi | 4:85dbf3e4d432 | 296 | // Input new use mode |
Arkadi | 4:85dbf3e4d432 | 297 | isInputNotValid = 1; |
Arkadi | 4:85dbf3e4d432 | 298 | while (isInputNotValid) { |
Arkadi | 5:65833e8cf4cf | 299 | printf("Please, select use mode: \r\n"); |
Arkadi | 5:65833e8cf4cf | 300 | printf("%d - IIRLPNORM filter\r\n", IIRLPNORM_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 301 | printf("%d - High Pass filter\r\n", HIGH_PASS_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 302 | printf("%d - No filter\r\n", NO_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 303 | printf("%d - Predefined Output\r\n", PREDEFINED_OUTPUT_MODE); |
Arkadi | 5:65833e8cf4cf | 304 | printf("%d - Triggered Mode \r\n", TRIGGERED_OUTPUT_MODE); |
Arkadi | 4:85dbf3e4d432 | 305 | printf("Input your choice or hit Enter to continue main loop in the same use mode: "); |
Arkadi | 4:85dbf3e4d432 | 306 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 307 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 308 | // printf("Command:%s; command length:%d\n", command, strlen(command)); |
Arkadi | 4:85dbf3e4d432 | 309 | if (strlen(command)-2 != 0 ) { |
Arkadi | 4:85dbf3e4d432 | 310 | // convert characters to integer; if convertion not succeeded return 0 (i.e. IIRLPNORM_FILTER_MODE) |
Arkadi | 4:85dbf3e4d432 | 311 | UseFilterMode = atoi(&command[strlen(command)-2]); |
Arkadi | 4:85dbf3e4d432 | 312 | } |
TauZoolog | 3:25cd717ad782 | 313 | |
Arkadi | 4:85dbf3e4d432 | 314 | if (UseFilterMode >= IIRLPNORM_FILTER_MODE && UseFilterMode <= TRIGGERED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 315 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 316 | printf("Enter signal amplitude threshold to start generate predefined signal (default - %d): ", SIGNAL_LOW_THRESHOD); |
Arkadi | 4:85dbf3e4d432 | 317 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 318 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 319 | signal_low_threshold = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 320 | if (signal_low_threshold == 0) { |
Arkadi | 5:65833e8cf4cf | 321 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 322 | signal_low_threshold = SIGNAL_LOW_THRESHOD; |
Arkadi | 4:85dbf3e4d432 | 323 | } |
TauZoolog | 3:25cd717ad782 | 324 | |
Arkadi | 4:85dbf3e4d432 | 325 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 326 | while (isSignalClipped) { |
Arkadi | 4:85dbf3e4d432 | 327 | printf("Enter amplitude scale parameter for predefined signal (default - %5.2f): ", SCALE_FOR_PREDEFINED_OUTPUT); |
Arkadi | 4:85dbf3e4d432 | 328 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 329 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 330 | scale_for_predefined_output = atof(command); |
Arkadi | 4:85dbf3e4d432 | 331 | if (scale_for_predefined_output == float(0.0)) { |
Arkadi | 5:65833e8cf4cf | 332 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 333 | scale_for_predefined_output = SCALE_FOR_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 334 | } |
Arkadi | 4:85dbf3e4d432 | 335 | isSignalClipped = false; |
Arkadi | 4:85dbf3e4d432 | 336 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
Arkadi | 4:85dbf3e4d432 | 337 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
Arkadi | 4:85dbf3e4d432 | 338 | if (scaled_sounddata[k] < (float)-1.0) { |
Arkadi | 4:85dbf3e4d432 | 339 | scaled_sounddata[k] = (float)-1.0; |
Arkadi | 4:85dbf3e4d432 | 340 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 341 | } |
Arkadi | 4:85dbf3e4d432 | 342 | if (scaled_sounddata[k] > (float)1.0) { |
Arkadi | 4:85dbf3e4d432 | 343 | scaled_sounddata[k] = (float)1.0; |
Arkadi | 4:85dbf3e4d432 | 344 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 345 | } |
Arkadi | 4:85dbf3e4d432 | 346 | } |
Arkadi | 4:85dbf3e4d432 | 347 | if (isSignalClipped) { |
Arkadi | 5:65833e8cf4cf | 348 | printf("With amplitude scale %5.2f, signal will be clipped !!!. Select smaller scale.\r\n",scale_for_predefined_output); |
Arkadi | 4:85dbf3e4d432 | 349 | } |
Arkadi | 4:85dbf3e4d432 | 350 | } // end of while (isSignalClipped) |
Arkadi | 4:85dbf3e4d432 | 351 | printf("Enter delay after signal in microseconds (default - %d): ", DELAY_AFTER_SIGNAL_TRANSMISSION); |
Arkadi | 4:85dbf3e4d432 | 352 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 353 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 354 | delay_after_signal_transmission = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 355 | if (delay_after_signal_transmission == 0) { |
Arkadi | 5:65833e8cf4cf | 356 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 357 | delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION; |
Arkadi | 4:85dbf3e4d432 | 358 | } |
Arkadi | 4:85dbf3e4d432 | 359 | printf("Enter number of cycles to detect threshold crossing (default - %d): ", NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING); |
Arkadi | 4:85dbf3e4d432 | 360 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 361 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 362 | num_of_cycles_to_detect_threshold_crossing = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 363 | if (num_of_cycles_to_detect_threshold_crossing == 0) { |
Arkadi | 5:65833e8cf4cf | 364 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 365 | num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING; |
Arkadi | 4:85dbf3e4d432 | 366 | } |
Arkadi | 4:85dbf3e4d432 | 367 | printf("Use high pass filter with predefined output: Y/N (default - %s): ", |
Arkadi | 4:85dbf3e4d432 | 368 | USE_FILTER_WITH_PREDEFINED_OUTPUT ? "Y" : "N" ); |
Arkadi | 4:85dbf3e4d432 | 369 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 370 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 371 | if ((command[0] == 'Y') || (command[0] == 'y')) { |
Arkadi | 4:85dbf3e4d432 | 372 | use_filter_with_predefined_output = true; |
Arkadi | 4:85dbf3e4d432 | 373 | } else if ((command[0] == 'N') || (command[0] == 'n')) { |
Arkadi | 4:85dbf3e4d432 | 374 | use_filter_with_predefined_output = false; |
Arkadi | 4:85dbf3e4d432 | 375 | } else { |
Arkadi | 4:85dbf3e4d432 | 376 | use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 377 | } |
TauZoolog | 3:25cd717ad782 | 378 | |
Arkadi | 4:85dbf3e4d432 | 379 | if (delay_after_signal_transmission == 0) { |
Arkadi | 4:85dbf3e4d432 | 380 | delay_after_signal_transmission = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 381 | } |
Arkadi | 4:85dbf3e4d432 | 382 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 383 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 384 | } else if (UseFilterMode == TEST_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 385 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 386 | } else if (UseFilterMode == TRIGGERED_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 387 | |
Arkadi | 5:65833e8cf4cf | 388 | // define threshold |
Arkadi | 5:65833e8cf4cf | 389 | printf("Enter signal trigger threshold (default - %f): ", TRIGGER_THRESHOLD_VALUE); |
Arkadi | 5:65833e8cf4cf | 390 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 391 | gets(command); |
Arkadi | 5:65833e8cf4cf | 392 | triggThresholdValue = atof(command); |
Arkadi | 5:65833e8cf4cf | 393 | if (triggThresholdValue == 0) { |
Arkadi | 5:65833e8cf4cf | 394 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 395 | triggThresholdValue = TRIGGER_THRESHOLD_VALUE; |
Arkadi | 5:65833e8cf4cf | 396 | } |
Arkadi | 5:65833e8cf4cf | 397 | printf("\r\nChosen - %f\r\n",triggThresholdValue); |
Arkadi | 5:65833e8cf4cf | 398 | |
Arkadi | 5:65833e8cf4cf | 399 | // define record time |
Arkadi | 5:65833e8cf4cf | 400 | printf("Enter record time (millis) (default - %f): ", SAMPLE_LENGTH); |
Arkadi | 5:65833e8cf4cf | 401 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 402 | gets(command); |
Arkadi | 5:65833e8cf4cf | 403 | sample_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples |
Arkadi | 5:65833e8cf4cf | 404 | if (sample_length == 0) { |
Arkadi | 5:65833e8cf4cf | 405 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 406 | sample_length = SAMPLE_LENGTH*(SampleRate/1000.0f); |
Arkadi | 5:65833e8cf4cf | 407 | } |
Arkadi | 5:65833e8cf4cf | 408 | printf("\r\n Signal samples - %f\r\n",sample_length); |
Arkadi | 5:65833e8cf4cf | 409 | |
Arkadi | 5:65833e8cf4cf | 410 | // define silence time |
Arkadi | 5:65833e8cf4cf | 411 | printf("Enter silence time (millis) (default - %f): ", QUIET_LENGTH); |
Arkadi | 5:65833e8cf4cf | 412 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 413 | gets(command); |
Arkadi | 5:65833e8cf4cf | 414 | quiet_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples |
Arkadi | 5:65833e8cf4cf | 415 | if (quiet_length == 0) { |
Arkadi | 5:65833e8cf4cf | 416 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 417 | quiet_length = QUIET_LENGTH*(SampleRate/1000.0f); |
Arkadi | 5:65833e8cf4cf | 418 | } |
Arkadi | 5:65833e8cf4cf | 419 | printf("\r\n silence samples - %f\r\n",quiet_length); |
Arkadi | 5:65833e8cf4cf | 420 | |
Arkadi | 5:65833e8cf4cf | 421 | // enable TRIGGER HPF |
Arkadi | 5:65833e8cf4cf | 422 | printf("Enter enable trigger HPF (default - %d): ", TRIGGER_HPF); |
Arkadi | 5:65833e8cf4cf | 423 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 424 | gets(command); |
Arkadi | 5:65833e8cf4cf | 425 | trigger_HPF = (bool)atoi(command); |
Arkadi | 5:65833e8cf4cf | 426 | printf("\r\nChosen - %d\r\n",trigger_HPF); |
Arkadi | 5:65833e8cf4cf | 427 | |
Arkadi | 5:65833e8cf4cf | 428 | // finish parameter settings |
Arkadi | 5:65833e8cf4cf | 429 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 430 | } else { |
Arkadi | 5:65833e8cf4cf | 431 | printf("\r\nWrong input - try again\r\n"); |
TauZoolog | 3:25cd717ad782 | 432 | } |
Arkadi | 4:85dbf3e4d432 | 433 | } |
Arkadi | 5:65833e8cf4cf | 434 | LoopCount++; |
Arkadi | 5:65833e8cf4cf | 435 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 436 | |
Arkadi | 5:65833e8cf4cf | 437 | } // end while(True) |
Arkadi | 5:65833e8cf4cf | 438 | } |
Arkadi | 4:85dbf3e4d432 | 439 | } |