Chirp Signal Generator
Dependencies: mbed
Fork of TAU_ZOOLOG_Playback_Rev1_1 by
main_filter3.cpp@6:f14547e1cc04, 2017-07-10 (annotated)
- Committer:
- Arkadi
- Date:
- Mon Jul 10 14:30:48 2017 +0000
- Revision:
- 6:f14547e1cc04
- Parent:
- 5:65833e8cf4cf
- Child:
- 8:4a9979fe0122
Updated saturation detector
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 | 6:f14547e1cc04 | 98 | // Filter variables |
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 | 6:f14547e1cc04 | 107 | float Tau=TAU_AHPF/TWOPI; // time constat of the filter, (1khz -> 0.001 second) (converted to hz from rad/sec |
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 | 6:f14547e1cc04 | 114 | // Saturation variables |
Arkadi | 6:f14547e1cc04 | 115 | float saturation_threshold=SATURATION_THRESHOLD; |
Arkadi | 6:f14547e1cc04 | 116 | int num_saturation_samples=NUM_SATURATION_SAMPLES; |
Arkadi | 6:f14547e1cc04 | 117 | uint16_t saturation_threshold_uint=(uint16_t)(saturation_threshold*((float)0xfff)); |
Arkadi | 4:85dbf3e4d432 | 118 | |
TauZoolog | 3:25cd717ad782 | 119 | inline void NOP() |
TauZoolog | 3:25cd717ad782 | 120 | { |
TauZoolog | 3:25cd717ad782 | 121 | __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess |
TauZoolog | 3:25cd717ad782 | 122 | } |
TauZoolog | 3:25cd717ad782 | 123 | |
TauZoolog | 3:25cd717ad782 | 124 | // User Button Interrupt Service Routine (ISR) |
TauZoolog | 3:25cd717ad782 | 125 | void pressed() |
TauZoolog | 3:25cd717ad782 | 126 | { |
TauZoolog | 3:25cd717ad782 | 127 | UserButtonPressed = 0; |
TauZoolog | 3:25cd717ad782 | 128 | } |
TauZoolog | 3:25cd717ad782 | 129 | |
TauZoolog | 3:25cd717ad782 | 130 | int checkKeyboardInput(void) |
TauZoolog | 3:25cd717ad782 | 131 | { |
TauZoolog | 3:25cd717ad782 | 132 | if (pc.readable()) |
TauZoolog | 3:25cd717ad782 | 133 | return 0; // means has input |
TauZoolog | 3:25cd717ad782 | 134 | else |
TauZoolog | 3:25cd717ad782 | 135 | return 1; // means no input |
TauZoolog | 3:25cd717ad782 | 136 | } |
TauZoolog | 3:25cd717ad782 | 137 | |
TauZoolog | 3:25cd717ad782 | 138 | #include "adc_init.h" |
TauZoolog | 3:25cd717ad782 | 139 | |
TauZoolog | 3:25cd717ad782 | 140 | #include "iirlpnorm_filter.h" |
TauZoolog | 3:25cd717ad782 | 141 | |
TauZoolog | 3:25cd717ad782 | 142 | #include "high_path_filter.h" |
TauZoolog | 3:25cd717ad782 | 143 | |
TauZoolog | 3:25cd717ad782 | 144 | #include "no_filter.h" |
TauZoolog | 3:25cd717ad782 | 145 | |
TauZoolog | 3:25cd717ad782 | 146 | #include "predefined_output.h" |
TauZoolog | 3:25cd717ad782 | 147 | |
Arkadi | 4:85dbf3e4d432 | 148 | #include "triggered_pass.h" |
Arkadi | 4:85dbf3e4d432 | 149 | |
TauZoolog | 3:25cd717ad782 | 150 | void print_parameters() |
TauZoolog | 3:25cd717ad782 | 151 | { |
Arkadi | 5:65833e8cf4cf | 152 | printf("\r\n%s Digital Filter.\r\nSTART MAIN LOOP, use mode %d, loop #%d, number of sections: %d\r\n", |
TauZoolog | 3:25cd717ad782 | 153 | FilterType[UseFilterMode], UseFilterMode, LoopCount, |
TauZoolog | 3:25cd717ad782 | 154 | (UseFilterMode == IIRLPNORM_FILTER_MODE) ? NumSections : NumSectionsHP); |
TauZoolog | 3:25cd717ad782 | 155 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 156 | 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 | 157 | signal_low_threshold, scale_for_predefined_output, num_of_cycles_to_detect_threshold_crossing, delay_after_signal_transmission, |
TauZoolog | 3:25cd717ad782 | 158 | use_filter_with_predefined_output ? "Y" : "N"); |
TauZoolog | 3:25cd717ad782 | 159 | } |
TauZoolog | 3:25cd717ad782 | 160 | } |
TauZoolog | 3:25cd717ad782 | 161 | |
TauZoolog | 3:25cd717ad782 | 162 | // Main procedure |
Arkadi | 4:85dbf3e4d432 | 163 | int main() |
Arkadi | 4:85dbf3e4d432 | 164 | { |
Arkadi | 4:85dbf3e4d432 | 165 | char command[64]; |
Arkadi | 4:85dbf3e4d432 | 166 | int isInputNotValid; |
Arkadi | 4:85dbf3e4d432 | 167 | int k; |
Arkadi | 4:85dbf3e4d432 | 168 | bool isSignalClipped = false; |
TauZoolog | 3:25cd717ad782 | 169 | |
Arkadi | 4:85dbf3e4d432 | 170 | strcpy(FilterType[0], "IIRLPNORM filter"); |
Arkadi | 4:85dbf3e4d432 | 171 | strcpy(FilterType[1], "High Pass filter"); |
Arkadi | 4:85dbf3e4d432 | 172 | strcpy(FilterType[2], "No filter"); |
Arkadi | 4:85dbf3e4d432 | 173 | strcpy(FilterType[3], "Predefined Output"); |
Arkadi | 4:85dbf3e4d432 | 174 | strcpy(FilterType[4], "Test Output"); |
TauZoolog | 3:25cd717ad782 | 175 | |
Arkadi | 4:85dbf3e4d432 | 176 | ADC1_Init(); |
Arkadi | 4:85dbf3e4d432 | 177 | DAC1_Init(); |
TauZoolog | 3:25cd717ad782 | 178 | |
Arkadi | 4:85dbf3e4d432 | 179 | HAL_ADC_Start(&hadc1); |
Arkadi | 4:85dbf3e4d432 | 180 | HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); |
TauZoolog | 3:25cd717ad782 | 181 | |
Arkadi | 4:85dbf3e4d432 | 182 | // define Dac Register for direct method of setting DAC value`s |
Arkadi | 4:85dbf3e4d432 | 183 | Dac_Reg = (uint32_t) (hdac1.Instance); |
Arkadi | 4:85dbf3e4d432 | 184 | Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R); |
TauZoolog | 3:25cd717ad782 | 185 | |
Arkadi | 4:85dbf3e4d432 | 186 | typedef void(*functionPtr)(void); |
Arkadi | 4:85dbf3e4d432 | 187 | functionPtr FilterFunction; |
Arkadi | 4:85dbf3e4d432 | 188 | |
Arkadi | 4:85dbf3e4d432 | 189 | // Assign ISR |
Arkadi | 4:85dbf3e4d432 | 190 | mybutton.fall(&pressed); |
Arkadi | 4:85dbf3e4d432 | 191 | |
Arkadi | 4:85dbf3e4d432 | 192 | LoopCount++; |
Arkadi | 4:85dbf3e4d432 | 193 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 194 | |
Arkadi | 4:85dbf3e4d432 | 195 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 196 | // Prepare scaled sound data |
Arkadi | 4:85dbf3e4d432 | 197 | isSignalClipped = false; |
Arkadi | 4:85dbf3e4d432 | 198 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
Arkadi | 4:85dbf3e4d432 | 199 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
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; |
Arkadi | 4:85dbf3e4d432 | 203 | } |
Arkadi | 4:85dbf3e4d432 | 204 | if (scaled_sounddata[k] > (float)1.0) { |
Arkadi | 4:85dbf3e4d432 | 205 | scaled_sounddata[k] = (float)1.0; |
Arkadi | 4:85dbf3e4d432 | 206 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 207 | } |
TauZoolog | 3:25cd717ad782 | 208 | } |
Arkadi | 4:85dbf3e4d432 | 209 | } |
TauZoolog | 3:25cd717ad782 | 210 | |
Arkadi | 4:85dbf3e4d432 | 211 | // Infinite loop |
Arkadi | 4:85dbf3e4d432 | 212 | while(true) { |
Arkadi | 4:85dbf3e4d432 | 213 | switch (UseFilterMode) { |
Arkadi | 4:85dbf3e4d432 | 214 | case IIRLPNORM_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 215 | FilterFunction = iirlpnorm_filter; |
Arkadi | 5:65833e8cf4cf | 216 | printf("Running IIRLPNORM filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 217 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 218 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 219 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 220 | break; |
Arkadi | 4:85dbf3e4d432 | 221 | // end of case IIRLPNORM_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 222 | |
Arkadi | 4:85dbf3e4d432 | 223 | case HIGH_PASS_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 224 | FilterFunction = highpath_filter; |
Arkadi | 5:65833e8cf4cf | 225 | printf("Running High Path filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 226 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 227 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 228 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 229 | break; |
Arkadi | 4:85dbf3e4d432 | 230 | // end of case HIGH_PASS_FILTER_MODE |
Arkadi | 4:85dbf3e4d432 | 231 | |
Arkadi | 4:85dbf3e4d432 | 232 | case PREDEFINED_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 233 | FilterFunction = predefined_output; |
Arkadi | 5:65833e8cf4cf | 234 | printf("Running Predefined Output\r\n"); |
Arkadi | 4:85dbf3e4d432 | 235 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 236 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 237 | memset(LLastInput, 0, sizeof(LLastInput)); |
Arkadi | 4:85dbf3e4d432 | 238 | num_threshold_crossing = 0; |
Arkadi | 4:85dbf3e4d432 | 239 | startPredefinedOutput = 0; |
Arkadi | 4:85dbf3e4d432 | 240 | num_back_to_normal = 0; |
Arkadi | 4:85dbf3e4d432 | 241 | break; |
Arkadi | 4:85dbf3e4d432 | 242 | // end of case PREDEFINED_OUTPUT_MODE |
Arkadi | 4:85dbf3e4d432 | 243 | |
Arkadi | 4:85dbf3e4d432 | 244 | case NO_FILTER_MODE: |
Arkadi | 4:85dbf3e4d432 | 245 | FilterFunction = no_filter; |
Arkadi | 5:65833e8cf4cf | 246 | printf("Running No filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 247 | break; |
Arkadi | 4:85dbf3e4d432 | 248 | // end of case NO_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 249 | |
Arkadi | 4:85dbf3e4d432 | 250 | case TRIGGERED_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 251 | FilterFunction = triggered_pass; |
Arkadi | 5:65833e8cf4cf | 252 | printf("Running Triggered Mode\r\n"); |
Arkadi | 4:85dbf3e4d432 | 253 | break; |
Arkadi | 4:85dbf3e4d432 | 254 | // end of case Triggered Mode |
Arkadi | 4:85dbf3e4d432 | 255 | |
Arkadi | 4:85dbf3e4d432 | 256 | case TEST_OUTPUT_MODE: |
Arkadi | 4:85dbf3e4d432 | 257 | FilterFunction = test_output; |
Arkadi | 5:65833e8cf4cf | 258 | printf("Running test output\r\n"); |
Arkadi | 4:85dbf3e4d432 | 259 | break; |
Arkadi | 4:85dbf3e4d432 | 260 | // end of case TEST_OUTPUT_MODE |
Arkadi | 4:85dbf3e4d432 | 261 | |
Arkadi | 4:85dbf3e4d432 | 262 | default: |
Arkadi | 4:85dbf3e4d432 | 263 | printf("Wrong User Filter Mode"); |
Arkadi | 4:85dbf3e4d432 | 264 | // Default - no filter |
Arkadi | 4:85dbf3e4d432 | 265 | FilterFunction = no_filter; |
Arkadi | 5:65833e8cf4cf | 266 | printf("No filter\r\n"); |
Arkadi | 4:85dbf3e4d432 | 267 | break; |
Arkadi | 4:85dbf3e4d432 | 268 | |
Arkadi | 4:85dbf3e4d432 | 269 | } // end of switch (UserFilterMode) |
TauZoolog | 3:25cd717ad782 | 270 | |
Arkadi | 4:85dbf3e4d432 | 271 | UserButtonPressed = 1; |
Arkadi | 4:85dbf3e4d432 | 272 | NumCycles = 0; |
Arkadi | 4:85dbf3e4d432 | 273 | ADCValueMax = 0; |
Arkadi | 4:85dbf3e4d432 | 274 | ADCValueMin = 0xfff; |
TauZoolog | 3:25cd717ad782 | 275 | |
Arkadi | 4:85dbf3e4d432 | 276 | // ==================================================== |
Arkadi | 4:85dbf3e4d432 | 277 | // Start signal processing |
Arkadi | 4:85dbf3e4d432 | 278 | while(UserButtonPressed) { |
Arkadi | 4:85dbf3e4d432 | 279 | FilterFunction(); |
Arkadi | 4:85dbf3e4d432 | 280 | NumCycles++; |
Arkadi | 4:85dbf3e4d432 | 281 | // Check keyboard input each NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT cycles |
Arkadi | 4:85dbf3e4d432 | 282 | if((NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT > 0) && (NumCycles % NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT == 0)) { |
Arkadi | 4:85dbf3e4d432 | 283 | // printf("Check keyboard input. Cycle: %d\n", NumCycles); |
Arkadi | 4:85dbf3e4d432 | 284 | UserButtonPressed = checkKeyboardInput(); |
Arkadi | 4:85dbf3e4d432 | 285 | } |
Arkadi | 4:85dbf3e4d432 | 286 | } // end of while(UserButtonPressed) |
Arkadi | 4:85dbf3e4d432 | 287 | // End of signal processing |
Arkadi | 4:85dbf3e4d432 | 288 | // ==================================================== |
Arkadi | 4:85dbf3e4d432 | 289 | |
Arkadi | 4:85dbf3e4d432 | 290 | // User button pressed |
Arkadi | 4:85dbf3e4d432 | 291 | // Main loop working with ADC/DAC is stopped |
Arkadi | 4:85dbf3e4d432 | 292 | // Here should be functionality which should be done before start another loop with ADC/DAC |
Arkadi | 5:65833e8cf4cf | 293 | printf("\nKeyboard key or User button pressed! Exit from main loop.\r\n"); |
Arkadi | 4:85dbf3e4d432 | 294 | |
Arkadi | 4:85dbf3e4d432 | 295 | // Init filter variables |
Arkadi | 4:85dbf3e4d432 | 296 | memset(CurrInput, 0, sizeof(CurrInput)); |
Arkadi | 4:85dbf3e4d432 | 297 | memset(LastInput, 0, sizeof(LastInput)); |
Arkadi | 4:85dbf3e4d432 | 298 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 299 | |
Arkadi | 4:85dbf3e4d432 | 300 | // Input new use mode |
Arkadi | 4:85dbf3e4d432 | 301 | isInputNotValid = 1; |
Arkadi | 4:85dbf3e4d432 | 302 | while (isInputNotValid) { |
Arkadi | 5:65833e8cf4cf | 303 | printf("Please, select use mode: \r\n"); |
Arkadi | 5:65833e8cf4cf | 304 | printf("%d - IIRLPNORM filter\r\n", IIRLPNORM_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 305 | printf("%d - High Pass filter\r\n", HIGH_PASS_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 306 | printf("%d - No filter\r\n", NO_FILTER_MODE); |
Arkadi | 5:65833e8cf4cf | 307 | printf("%d - Predefined Output\r\n", PREDEFINED_OUTPUT_MODE); |
Arkadi | 5:65833e8cf4cf | 308 | printf("%d - Triggered Mode \r\n", TRIGGERED_OUTPUT_MODE); |
Arkadi | 4:85dbf3e4d432 | 309 | printf("Input your choice or hit Enter to continue main loop in the same use mode: "); |
Arkadi | 4:85dbf3e4d432 | 310 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 311 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 312 | // printf("Command:%s; command length:%d\n", command, strlen(command)); |
Arkadi | 4:85dbf3e4d432 | 313 | if (strlen(command)-2 != 0 ) { |
Arkadi | 4:85dbf3e4d432 | 314 | // convert characters to integer; if convertion not succeeded return 0 (i.e. IIRLPNORM_FILTER_MODE) |
Arkadi | 4:85dbf3e4d432 | 315 | UseFilterMode = atoi(&command[strlen(command)-2]); |
Arkadi | 4:85dbf3e4d432 | 316 | } |
TauZoolog | 3:25cd717ad782 | 317 | |
Arkadi | 4:85dbf3e4d432 | 318 | if (UseFilterMode >= IIRLPNORM_FILTER_MODE && UseFilterMode <= TRIGGERED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 319 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
Arkadi | 4:85dbf3e4d432 | 320 | printf("Enter signal amplitude threshold to start generate predefined signal (default - %d): ", SIGNAL_LOW_THRESHOD); |
Arkadi | 4:85dbf3e4d432 | 321 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 322 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 323 | signal_low_threshold = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 324 | if (signal_low_threshold == 0) { |
Arkadi | 5:65833e8cf4cf | 325 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 326 | signal_low_threshold = SIGNAL_LOW_THRESHOD; |
Arkadi | 4:85dbf3e4d432 | 327 | } |
TauZoolog | 3:25cd717ad782 | 328 | |
Arkadi | 4:85dbf3e4d432 | 329 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 330 | while (isSignalClipped) { |
Arkadi | 4:85dbf3e4d432 | 331 | printf("Enter amplitude scale parameter for predefined signal (default - %5.2f): ", SCALE_FOR_PREDEFINED_OUTPUT); |
Arkadi | 4:85dbf3e4d432 | 332 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 333 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 334 | scale_for_predefined_output = atof(command); |
Arkadi | 4:85dbf3e4d432 | 335 | if (scale_for_predefined_output == float(0.0)) { |
Arkadi | 5:65833e8cf4cf | 336 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 337 | scale_for_predefined_output = SCALE_FOR_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 338 | } |
Arkadi | 4:85dbf3e4d432 | 339 | isSignalClipped = false; |
Arkadi | 4:85dbf3e4d432 | 340 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
Arkadi | 4:85dbf3e4d432 | 341 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
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 | if (scaled_sounddata[k] > (float)1.0) { |
Arkadi | 4:85dbf3e4d432 | 347 | scaled_sounddata[k] = (float)1.0; |
Arkadi | 4:85dbf3e4d432 | 348 | isSignalClipped = true; |
Arkadi | 4:85dbf3e4d432 | 349 | } |
Arkadi | 4:85dbf3e4d432 | 350 | } |
Arkadi | 4:85dbf3e4d432 | 351 | if (isSignalClipped) { |
Arkadi | 5:65833e8cf4cf | 352 | printf("With amplitude scale %5.2f, signal will be clipped !!!. Select smaller scale.\r\n",scale_for_predefined_output); |
Arkadi | 4:85dbf3e4d432 | 353 | } |
Arkadi | 4:85dbf3e4d432 | 354 | } // end of while (isSignalClipped) |
Arkadi | 4:85dbf3e4d432 | 355 | printf("Enter delay after signal in microseconds (default - %d): ", DELAY_AFTER_SIGNAL_TRANSMISSION); |
Arkadi | 4:85dbf3e4d432 | 356 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 357 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 358 | delay_after_signal_transmission = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 359 | if (delay_after_signal_transmission == 0) { |
Arkadi | 5:65833e8cf4cf | 360 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 361 | delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION; |
Arkadi | 4:85dbf3e4d432 | 362 | } |
Arkadi | 4:85dbf3e4d432 | 363 | printf("Enter number of cycles to detect threshold crossing (default - %d): ", NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING); |
Arkadi | 4:85dbf3e4d432 | 364 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 365 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 366 | num_of_cycles_to_detect_threshold_crossing = atoi(command); |
Arkadi | 4:85dbf3e4d432 | 367 | if (num_of_cycles_to_detect_threshold_crossing == 0) { |
Arkadi | 5:65833e8cf4cf | 368 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 4:85dbf3e4d432 | 369 | num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING; |
Arkadi | 4:85dbf3e4d432 | 370 | } |
Arkadi | 4:85dbf3e4d432 | 371 | printf("Use high pass filter with predefined output: Y/N (default - %s): ", |
Arkadi | 4:85dbf3e4d432 | 372 | USE_FILTER_WITH_PREDEFINED_OUTPUT ? "Y" : "N" ); |
Arkadi | 4:85dbf3e4d432 | 373 | memset(command, 0, sizeof(command)); |
Arkadi | 4:85dbf3e4d432 | 374 | gets(command); |
Arkadi | 4:85dbf3e4d432 | 375 | if ((command[0] == 'Y') || (command[0] == 'y')) { |
Arkadi | 4:85dbf3e4d432 | 376 | use_filter_with_predefined_output = true; |
Arkadi | 4:85dbf3e4d432 | 377 | } else if ((command[0] == 'N') || (command[0] == 'n')) { |
Arkadi | 4:85dbf3e4d432 | 378 | use_filter_with_predefined_output = false; |
Arkadi | 4:85dbf3e4d432 | 379 | } else { |
Arkadi | 4:85dbf3e4d432 | 380 | use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 381 | } |
TauZoolog | 3:25cd717ad782 | 382 | |
Arkadi | 4:85dbf3e4d432 | 383 | if (delay_after_signal_transmission == 0) { |
Arkadi | 4:85dbf3e4d432 | 384 | delay_after_signal_transmission = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
Arkadi | 4:85dbf3e4d432 | 385 | } |
Arkadi | 4:85dbf3e4d432 | 386 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 387 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 388 | } else if (UseFilterMode == TEST_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 389 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 390 | } else if (UseFilterMode == TRIGGERED_OUTPUT_MODE) { |
Arkadi | 5:65833e8cf4cf | 391 | |
Arkadi | 5:65833e8cf4cf | 392 | // define threshold |
Arkadi | 5:65833e8cf4cf | 393 | printf("Enter signal trigger threshold (default - %f): ", TRIGGER_THRESHOLD_VALUE); |
Arkadi | 5:65833e8cf4cf | 394 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 395 | gets(command); |
Arkadi | 5:65833e8cf4cf | 396 | triggThresholdValue = atof(command); |
Arkadi | 5:65833e8cf4cf | 397 | if (triggThresholdValue == 0) { |
Arkadi | 5:65833e8cf4cf | 398 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 399 | triggThresholdValue = TRIGGER_THRESHOLD_VALUE; |
Arkadi | 5:65833e8cf4cf | 400 | } |
Arkadi | 5:65833e8cf4cf | 401 | printf("\r\nChosen - %f\r\n",triggThresholdValue); |
Arkadi | 5:65833e8cf4cf | 402 | |
Arkadi | 5:65833e8cf4cf | 403 | // define record time |
Arkadi | 5:65833e8cf4cf | 404 | printf("Enter record time (millis) (default - %f): ", SAMPLE_LENGTH); |
Arkadi | 5:65833e8cf4cf | 405 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 406 | gets(command); |
Arkadi | 5:65833e8cf4cf | 407 | sample_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples |
Arkadi | 5:65833e8cf4cf | 408 | if (sample_length == 0) { |
Arkadi | 5:65833e8cf4cf | 409 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 410 | sample_length = SAMPLE_LENGTH*(SampleRate/1000.0f); |
Arkadi | 5:65833e8cf4cf | 411 | } |
Arkadi | 5:65833e8cf4cf | 412 | printf("\r\n Signal samples - %f\r\n",sample_length); |
Arkadi | 5:65833e8cf4cf | 413 | |
Arkadi | 5:65833e8cf4cf | 414 | // define silence time |
Arkadi | 5:65833e8cf4cf | 415 | printf("Enter silence time (millis) (default - %f): ", QUIET_LENGTH); |
Arkadi | 5:65833e8cf4cf | 416 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 417 | gets(command); |
Arkadi | 5:65833e8cf4cf | 418 | quiet_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples |
Arkadi | 5:65833e8cf4cf | 419 | if (quiet_length == 0) { |
Arkadi | 5:65833e8cf4cf | 420 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 5:65833e8cf4cf | 421 | quiet_length = QUIET_LENGTH*(SampleRate/1000.0f); |
Arkadi | 5:65833e8cf4cf | 422 | } |
Arkadi | 5:65833e8cf4cf | 423 | printf("\r\n silence samples - %f\r\n",quiet_length); |
Arkadi | 6:f14547e1cc04 | 424 | |
Arkadi | 5:65833e8cf4cf | 425 | // enable TRIGGER HPF |
Arkadi | 5:65833e8cf4cf | 426 | printf("Enter enable trigger HPF (default - %d): ", TRIGGER_HPF); |
Arkadi | 5:65833e8cf4cf | 427 | memset(command, 0, sizeof(command)); |
Arkadi | 5:65833e8cf4cf | 428 | gets(command); |
Arkadi | 5:65833e8cf4cf | 429 | trigger_HPF = (bool)atoi(command); |
Arkadi | 5:65833e8cf4cf | 430 | printf("\r\nChosen - %d\r\n",trigger_HPF); |
Arkadi | 5:65833e8cf4cf | 431 | |
Arkadi | 6:f14547e1cc04 | 432 | // set saturation threshold |
Arkadi | 6:f14547e1cc04 | 433 | printf("Enter Saturation threshold (default - %f): ", SATURATION_THRESHOLD); |
Arkadi | 6:f14547e1cc04 | 434 | memset(command, 0, sizeof(command)); |
Arkadi | 6:f14547e1cc04 | 435 | gets(command); |
Arkadi | 6:f14547e1cc04 | 436 | saturation_threshold =atof(command); |
Arkadi | 6:f14547e1cc04 | 437 | if (saturation_threshold == 0) { |
Arkadi | 6:f14547e1cc04 | 438 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 6:f14547e1cc04 | 439 | saturation_threshold = SATURATION_THRESHOLD; |
Arkadi | 6:f14547e1cc04 | 440 | } |
Arkadi | 6:f14547e1cc04 | 441 | saturation_threshold_uint=(uint16_t)(saturation_threshold*((float)0xfff)); |
Arkadi | 6:f14547e1cc04 | 442 | printf("\r\nChosen - %f int value %d \r\n",saturation_threshold,saturation_threshold_uint); |
Arkadi | 6:f14547e1cc04 | 443 | |
Arkadi | 6:f14547e1cc04 | 444 | // set saturation sample numbers |
Arkadi | 6:f14547e1cc04 | 445 | printf("Enter Saturation sample number (default - %d): ", NUM_SATURATION_SAMPLES); |
Arkadi | 6:f14547e1cc04 | 446 | memset(command, 0, sizeof(command)); |
Arkadi | 6:f14547e1cc04 | 447 | gets(command); |
Arkadi | 6:f14547e1cc04 | 448 | num_saturation_samples =atoi(command); |
Arkadi | 6:f14547e1cc04 | 449 | if (num_saturation_samples == 0) { |
Arkadi | 6:f14547e1cc04 | 450 | printf("\r\nWrong input - default is taken\r\n"); |
Arkadi | 6:f14547e1cc04 | 451 | num_saturation_samples = NUM_SATURATION_SAMPLES; |
Arkadi | 6:f14547e1cc04 | 452 | } |
Arkadi | 6:f14547e1cc04 | 453 | printf("\r\nChosen - %d\r\n",num_saturation_samples); |
Arkadi | 6:f14547e1cc04 | 454 | |
Arkadi | 5:65833e8cf4cf | 455 | // finish parameter settings |
Arkadi | 5:65833e8cf4cf | 456 | isInputNotValid = 0; |
Arkadi | 5:65833e8cf4cf | 457 | } else { |
Arkadi | 5:65833e8cf4cf | 458 | printf("\r\nWrong input - try again\r\n"); |
TauZoolog | 3:25cd717ad782 | 459 | } |
Arkadi | 4:85dbf3e4d432 | 460 | } |
Arkadi | 5:65833e8cf4cf | 461 | LoopCount++; |
Arkadi | 5:65833e8cf4cf | 462 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 463 | |
Arkadi | 5:65833e8cf4cf | 464 | } // end while(True) |
Arkadi | 5:65833e8cf4cf | 465 | } |
Arkadi | 4:85dbf3e4d432 | 466 | } |