Chirp Signal Generator
Dependencies: mbed
Fork of TAU_ZOOLOG_Playback_Rev1_1 by
main_filter3.cpp@3:25cd717ad782, 2017-06-27 (annotated)
- Committer:
- TauZoolog
- Date:
- Tue Jun 27 13:01:03 2017 +0000
- Revision:
- 3:25cd717ad782
- Child:
- 4:85dbf3e4d432
Sasha Father did extensive work on user interface and code implementations for STM32F446 Setup. For reference design.
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 | |
TauZoolog | 3:25cd717ad782 | 19 | #define TEST_OUTPUT_MODE 4 |
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 | |
TauZoolog | 3:25cd717ad782 | 25 | // DigitalOut led(LED1); |
TauZoolog | 3:25cd717ad782 | 26 | DigitalOut mytoggle(PA_6); |
TauZoolog | 3:25cd717ad782 | 27 | |
TauZoolog | 3:25cd717ad782 | 28 | // User Button as interrupt |
TauZoolog | 3:25cd717ad782 | 29 | InterruptIn mybutton(USER_BUTTON); |
TauZoolog | 3:25cd717ad782 | 30 | |
TauZoolog | 3:25cd717ad782 | 31 | // Serial over USB as input device |
TauZoolog | 3:25cd717ad782 | 32 | Serial pc(SERIAL_TX, SERIAL_RX); |
TauZoolog | 3:25cd717ad782 | 33 | |
TauZoolog | 3:25cd717ad782 | 34 | // ADC/DAC declarations |
TauZoolog | 3:25cd717ad782 | 35 | ADC_HandleTypeDef hadc1; |
TauZoolog | 3:25cd717ad782 | 36 | DAC_HandleTypeDef hdac1; |
TauZoolog | 3:25cd717ad782 | 37 | |
TauZoolog | 3:25cd717ad782 | 38 | // Dac Register for direct method of setting DAC value`s |
TauZoolog | 3:25cd717ad782 | 39 | __IO uint32_t Dac_Reg = 0; |
TauZoolog | 3:25cd717ad782 | 40 | |
TauZoolog | 3:25cd717ad782 | 41 | // Variables |
TauZoolog | 3:25cd717ad782 | 42 | uint16_t ADCValueIn=0; |
TauZoolog | 3:25cd717ad782 | 43 | uint16_t ADCValueOut=0; |
TauZoolog | 3:25cd717ad782 | 44 | float ADCFloat=0; |
TauZoolog | 3:25cd717ad782 | 45 | float ADCFloatFiltered=0; |
TauZoolog | 3:25cd717ad782 | 46 | float OutputADCFloat=0; |
TauZoolog | 3:25cd717ad782 | 47 | float ADC2Float=(2.0f/4095.0f); //ADCvalue*(2/0xFFF)-1.0f // 12 bits range |
TauZoolog | 3:25cd717ad782 | 48 | float Float2ADC=(4095.0f/2.0f); //(ADCvalue+1.0f)*(0xFFF/2) // 12 bits range |
TauZoolog | 3:25cd717ad782 | 49 | // float ADC2Float= 1.0; |
TauZoolog | 3:25cd717ad782 | 50 | // float Float2ADC= 1.0; |
TauZoolog | 3:25cd717ad782 | 51 | uint16_t ADCValueMax = 0; |
TauZoolog | 3:25cd717ad782 | 52 | uint16_t ADCValueMin = 0xfff; |
TauZoolog | 3:25cd717ad782 | 53 | |
TauZoolog | 3:25cd717ad782 | 54 | // Definitions for software developer |
TauZoolog | 3:25cd717ad782 | 55 | #define NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT ((long)300000) // 0 - not check keyboard input |
TauZoolog | 3:25cd717ad782 | 56 | #define SAMPLING_FREQUENCY_DELAY 2 // microseconds |
TauZoolog | 3:25cd717ad782 | 57 | #define CONSTANT_SIGNAL_LEVEL_FOR_TEST 0.2 |
TauZoolog | 3:25cd717ad782 | 58 | #define NUM_OF_CYCLES_BACK_TO_NORMAL 0 // User can play with this. Hysteresis, 0 - no hysteresis |
TauZoolog | 3:25cd717ad782 | 59 | |
TauZoolog | 3:25cd717ad782 | 60 | float scale_for_predefined_output = (float)SCALE_FOR_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 61 | int sampling_frequency_delay = SAMPLING_FREQUENCY_DELAY; |
TauZoolog | 3:25cd717ad782 | 62 | int delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION; |
TauZoolog | 3:25cd717ad782 | 63 | bool use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 64 | int num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING; |
TauZoolog | 3:25cd717ad782 | 65 | |
TauZoolog | 3:25cd717ad782 | 66 | int startPredefinedOutput = 0; |
TauZoolog | 3:25cd717ad782 | 67 | int num_threshold_crossing = 0; |
TauZoolog | 3:25cd717ad782 | 68 | int num_back_to_normal = 0; |
TauZoolog | 3:25cd717ad782 | 69 | int signal_low_threshold = SIGNAL_LOW_THRESHOD; |
TauZoolog | 3:25cd717ad782 | 70 | |
TauZoolog | 3:25cd717ad782 | 71 | int UserButtonPressed; |
TauZoolog | 3:25cd717ad782 | 72 | long NumCycles; |
TauZoolog | 3:25cd717ad782 | 73 | |
TauZoolog | 3:25cd717ad782 | 74 | // second-order sections filter variables - upto 8 sections |
TauZoolog | 3:25cd717ad782 | 75 | #define MAX_SECTION_NUMBER 8 |
TauZoolog | 3:25cd717ad782 | 76 | int NumSections = sizeof(SOSMat)/sizeof(float)/6; |
TauZoolog | 3:25cd717ad782 | 77 | int NumSectionsHP = sizeof(SOSMatHP)/sizeof(float)/6; |
TauZoolog | 3:25cd717ad782 | 78 | |
TauZoolog | 3:25cd717ad782 | 79 | // Inputs |
TauZoolog | 3:25cd717ad782 | 80 | float CurrInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 81 | float LastInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 82 | float LLastInput [MAX_SECTION_NUMBER+1]; |
TauZoolog | 3:25cd717ad782 | 83 | |
TauZoolog | 3:25cd717ad782 | 84 | float scaled_sounddata[AMOUNT_OF_SIGNIFICANT_SAMPLES]; |
TauZoolog | 3:25cd717ad782 | 85 | char FilterType[5][32]; |
TauZoolog | 3:25cd717ad782 | 86 | int LoopCount = 0; |
TauZoolog | 3:25cd717ad782 | 87 | |
TauZoolog | 3:25cd717ad782 | 88 | inline void NOP() |
TauZoolog | 3:25cd717ad782 | 89 | { |
TauZoolog | 3:25cd717ad782 | 90 | __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess |
TauZoolog | 3:25cd717ad782 | 91 | } |
TauZoolog | 3:25cd717ad782 | 92 | |
TauZoolog | 3:25cd717ad782 | 93 | // User Button Interrupt Service Routine (ISR) |
TauZoolog | 3:25cd717ad782 | 94 | void pressed() |
TauZoolog | 3:25cd717ad782 | 95 | { |
TauZoolog | 3:25cd717ad782 | 96 | UserButtonPressed = 0; |
TauZoolog | 3:25cd717ad782 | 97 | } |
TauZoolog | 3:25cd717ad782 | 98 | |
TauZoolog | 3:25cd717ad782 | 99 | int checkKeyboardInput(void) |
TauZoolog | 3:25cd717ad782 | 100 | { |
TauZoolog | 3:25cd717ad782 | 101 | if (pc.readable()) |
TauZoolog | 3:25cd717ad782 | 102 | return 0; // means has input |
TauZoolog | 3:25cd717ad782 | 103 | else |
TauZoolog | 3:25cd717ad782 | 104 | return 1; // means no input |
TauZoolog | 3:25cd717ad782 | 105 | } |
TauZoolog | 3:25cd717ad782 | 106 | |
TauZoolog | 3:25cd717ad782 | 107 | #include "adc_init.h" |
TauZoolog | 3:25cd717ad782 | 108 | |
TauZoolog | 3:25cd717ad782 | 109 | #include "iirlpnorm_filter.h" |
TauZoolog | 3:25cd717ad782 | 110 | |
TauZoolog | 3:25cd717ad782 | 111 | #include "high_path_filter.h" |
TauZoolog | 3:25cd717ad782 | 112 | |
TauZoolog | 3:25cd717ad782 | 113 | #include "no_filter.h" |
TauZoolog | 3:25cd717ad782 | 114 | |
TauZoolog | 3:25cd717ad782 | 115 | #include "predefined_output.h" |
TauZoolog | 3:25cd717ad782 | 116 | |
TauZoolog | 3:25cd717ad782 | 117 | void print_parameters() |
TauZoolog | 3:25cd717ad782 | 118 | { |
TauZoolog | 3:25cd717ad782 | 119 | printf("\n%s Digital Filter.\nSTART MAIN LOOP, use mode %d, loop #%d, number of sections: %d\n", |
TauZoolog | 3:25cd717ad782 | 120 | FilterType[UseFilterMode], UseFilterMode, LoopCount, |
TauZoolog | 3:25cd717ad782 | 121 | (UseFilterMode == IIRLPNORM_FILTER_MODE) ? NumSections : NumSectionsHP); |
TauZoolog | 3:25cd717ad782 | 122 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
TauZoolog | 3:25cd717ad782 | 123 | printf("Signal threshould: %d\nSignal scale: %5.2f\nNumber of cycles to detect threshold crossing: %d\nDelay after signal in microseconds: %d\nUse filter: %s\n", |
TauZoolog | 3:25cd717ad782 | 124 | signal_low_threshold, scale_for_predefined_output, num_of_cycles_to_detect_threshold_crossing, delay_after_signal_transmission, |
TauZoolog | 3:25cd717ad782 | 125 | use_filter_with_predefined_output ? "Y" : "N"); |
TauZoolog | 3:25cd717ad782 | 126 | } |
TauZoolog | 3:25cd717ad782 | 127 | } |
TauZoolog | 3:25cd717ad782 | 128 | |
TauZoolog | 3:25cd717ad782 | 129 | // Main procedure |
TauZoolog | 3:25cd717ad782 | 130 | int main() { |
TauZoolog | 3:25cd717ad782 | 131 | char command[64]; |
TauZoolog | 3:25cd717ad782 | 132 | int isInputNotValid; |
TauZoolog | 3:25cd717ad782 | 133 | int k; |
TauZoolog | 3:25cd717ad782 | 134 | bool isSignalClipped = false; |
TauZoolog | 3:25cd717ad782 | 135 | |
TauZoolog | 3:25cd717ad782 | 136 | strcpy(FilterType[0], "IIRLPNORM filter"); |
TauZoolog | 3:25cd717ad782 | 137 | strcpy(FilterType[1], "High Pass filter"); |
TauZoolog | 3:25cd717ad782 | 138 | strcpy(FilterType[2], "No filter"); |
TauZoolog | 3:25cd717ad782 | 139 | strcpy(FilterType[3], "Predefined Output"); |
TauZoolog | 3:25cd717ad782 | 140 | strcpy(FilterType[4], "Test Output"); |
TauZoolog | 3:25cd717ad782 | 141 | |
TauZoolog | 3:25cd717ad782 | 142 | ADC1_Init(); |
TauZoolog | 3:25cd717ad782 | 143 | DAC1_Init(); |
TauZoolog | 3:25cd717ad782 | 144 | |
TauZoolog | 3:25cd717ad782 | 145 | HAL_ADC_Start(&hadc1); |
TauZoolog | 3:25cd717ad782 | 146 | HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); |
TauZoolog | 3:25cd717ad782 | 147 | |
TauZoolog | 3:25cd717ad782 | 148 | // define Dac Register for direct method of setting DAC value`s |
TauZoolog | 3:25cd717ad782 | 149 | Dac_Reg = (uint32_t) (hdac1.Instance); |
TauZoolog | 3:25cd717ad782 | 150 | Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R); |
TauZoolog | 3:25cd717ad782 | 151 | |
TauZoolog | 3:25cd717ad782 | 152 | typedef void(*functionPtr)(void); |
TauZoolog | 3:25cd717ad782 | 153 | functionPtr FilterFunction; |
TauZoolog | 3:25cd717ad782 | 154 | |
TauZoolog | 3:25cd717ad782 | 155 | // Assign ISR |
TauZoolog | 3:25cd717ad782 | 156 | mybutton.fall(&pressed); |
TauZoolog | 3:25cd717ad782 | 157 | |
TauZoolog | 3:25cd717ad782 | 158 | LoopCount++; |
TauZoolog | 3:25cd717ad782 | 159 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 160 | |
TauZoolog | 3:25cd717ad782 | 161 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
TauZoolog | 3:25cd717ad782 | 162 | // Prepare scaled sound data |
TauZoolog | 3:25cd717ad782 | 163 | isSignalClipped = false; |
TauZoolog | 3:25cd717ad782 | 164 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
TauZoolog | 3:25cd717ad782 | 165 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
TauZoolog | 3:25cd717ad782 | 166 | if (scaled_sounddata[k] < (float)-1.0) { |
TauZoolog | 3:25cd717ad782 | 167 | scaled_sounddata[k] = (float)-1.0; |
TauZoolog | 3:25cd717ad782 | 168 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 169 | } |
TauZoolog | 3:25cd717ad782 | 170 | if (scaled_sounddata[k] > (float)1.0) { |
TauZoolog | 3:25cd717ad782 | 171 | scaled_sounddata[k] = (float)1.0; |
TauZoolog | 3:25cd717ad782 | 172 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 173 | } |
TauZoolog | 3:25cd717ad782 | 174 | } |
TauZoolog | 3:25cd717ad782 | 175 | } |
TauZoolog | 3:25cd717ad782 | 176 | |
TauZoolog | 3:25cd717ad782 | 177 | // Infinite loop |
TauZoolog | 3:25cd717ad782 | 178 | while(true) { |
TauZoolog | 3:25cd717ad782 | 179 | switch (UseFilterMode) { |
TauZoolog | 3:25cd717ad782 | 180 | case IIRLPNORM_FILTER_MODE: |
TauZoolog | 3:25cd717ad782 | 181 | FilterFunction = iirlpnorm_filter; |
TauZoolog | 3:25cd717ad782 | 182 | printf("Running IIRLPNORM filter\n"); |
TauZoolog | 3:25cd717ad782 | 183 | memset(CurrInput, 0, sizeof(CurrInput)); |
TauZoolog | 3:25cd717ad782 | 184 | memset(LastInput, 0, sizeof(LastInput)); |
TauZoolog | 3:25cd717ad782 | 185 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 186 | break; |
TauZoolog | 3:25cd717ad782 | 187 | // end of case IIRLPNORM_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 188 | |
TauZoolog | 3:25cd717ad782 | 189 | case HIGH_PASS_FILTER_MODE: |
TauZoolog | 3:25cd717ad782 | 190 | FilterFunction = highpath_filter; |
TauZoolog | 3:25cd717ad782 | 191 | printf("Running High Path filter\n"); |
TauZoolog | 3:25cd717ad782 | 192 | memset(CurrInput, 0, sizeof(CurrInput)); |
TauZoolog | 3:25cd717ad782 | 193 | memset(LastInput, 0, sizeof(LastInput)); |
TauZoolog | 3:25cd717ad782 | 194 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 195 | break; |
TauZoolog | 3:25cd717ad782 | 196 | // end of case HIGH_PASS_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 197 | |
TauZoolog | 3:25cd717ad782 | 198 | case PREDEFINED_OUTPUT_MODE: |
TauZoolog | 3:25cd717ad782 | 199 | FilterFunction = predefined_output; |
TauZoolog | 3:25cd717ad782 | 200 | printf("Running Predefined Output\n"); |
TauZoolog | 3:25cd717ad782 | 201 | memset(CurrInput, 0, sizeof(CurrInput)); |
TauZoolog | 3:25cd717ad782 | 202 | memset(LastInput, 0, sizeof(LastInput)); |
TauZoolog | 3:25cd717ad782 | 203 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 204 | num_threshold_crossing = 0; |
TauZoolog | 3:25cd717ad782 | 205 | startPredefinedOutput = 0; |
TauZoolog | 3:25cd717ad782 | 206 | num_back_to_normal = 0; |
TauZoolog | 3:25cd717ad782 | 207 | break; |
TauZoolog | 3:25cd717ad782 | 208 | // end of case PREDEFINED_OUTPUT_MODE |
TauZoolog | 3:25cd717ad782 | 209 | |
TauZoolog | 3:25cd717ad782 | 210 | case NO_FILTER_MODE: |
TauZoolog | 3:25cd717ad782 | 211 | FilterFunction = no_filter; |
TauZoolog | 3:25cd717ad782 | 212 | printf("Running No filter\n"); |
TauZoolog | 3:25cd717ad782 | 213 | break; |
TauZoolog | 3:25cd717ad782 | 214 | // end of case NO_FILTER_MODE |
TauZoolog | 3:25cd717ad782 | 215 | |
TauZoolog | 3:25cd717ad782 | 216 | case TEST_OUTPUT_MODE: |
TauZoolog | 3:25cd717ad782 | 217 | FilterFunction = test_output; |
TauZoolog | 3:25cd717ad782 | 218 | printf("Running test output\n"); |
TauZoolog | 3:25cd717ad782 | 219 | break; |
TauZoolog | 3:25cd717ad782 | 220 | // end of case TEST_OUTPUT_MODE |
TauZoolog | 3:25cd717ad782 | 221 | |
TauZoolog | 3:25cd717ad782 | 222 | default: |
TauZoolog | 3:25cd717ad782 | 223 | printf("Wrong User Filter Mode"); |
TauZoolog | 3:25cd717ad782 | 224 | // Default - no filter |
TauZoolog | 3:25cd717ad782 | 225 | FilterFunction = no_filter; |
TauZoolog | 3:25cd717ad782 | 226 | printf("No filter\n"); |
TauZoolog | 3:25cd717ad782 | 227 | break; |
TauZoolog | 3:25cd717ad782 | 228 | |
TauZoolog | 3:25cd717ad782 | 229 | } // end of switch (UserFilterMode) |
TauZoolog | 3:25cd717ad782 | 230 | |
TauZoolog | 3:25cd717ad782 | 231 | UserButtonPressed = 1; |
TauZoolog | 3:25cd717ad782 | 232 | NumCycles = 0; |
TauZoolog | 3:25cd717ad782 | 233 | ADCValueMax = 0; |
TauZoolog | 3:25cd717ad782 | 234 | ADCValueMin = 0xfff; |
TauZoolog | 3:25cd717ad782 | 235 | |
TauZoolog | 3:25cd717ad782 | 236 | // ==================================================== |
TauZoolog | 3:25cd717ad782 | 237 | // Start signal processing |
TauZoolog | 3:25cd717ad782 | 238 | while(UserButtonPressed) { |
TauZoolog | 3:25cd717ad782 | 239 | FilterFunction(); |
TauZoolog | 3:25cd717ad782 | 240 | NumCycles++; |
TauZoolog | 3:25cd717ad782 | 241 | // Check keyboard input each NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT cycles |
TauZoolog | 3:25cd717ad782 | 242 | if((NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT > 0) && (NumCycles % NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT == 0)) { |
TauZoolog | 3:25cd717ad782 | 243 | // printf("Check keyboard input. Cycle: %d\n", NumCycles); |
TauZoolog | 3:25cd717ad782 | 244 | UserButtonPressed = checkKeyboardInput(); |
TauZoolog | 3:25cd717ad782 | 245 | } |
TauZoolog | 3:25cd717ad782 | 246 | } // end of while(UserButtonPressed) |
TauZoolog | 3:25cd717ad782 | 247 | // End of signal processing |
TauZoolog | 3:25cd717ad782 | 248 | // ==================================================== |
TauZoolog | 3:25cd717ad782 | 249 | |
TauZoolog | 3:25cd717ad782 | 250 | // User button pressed |
TauZoolog | 3:25cd717ad782 | 251 | // Main loop working with ADC/DAC is stopped |
TauZoolog | 3:25cd717ad782 | 252 | // Here should be functionality which should be done before start another loop with ADC/DAC |
TauZoolog | 3:25cd717ad782 | 253 | printf("\nKeyboard key or User button pressed! Exit from main loop.\n"); |
TauZoolog | 3:25cd717ad782 | 254 | |
TauZoolog | 3:25cd717ad782 | 255 | // Init filter variables |
TauZoolog | 3:25cd717ad782 | 256 | memset(CurrInput, 0, sizeof(CurrInput)); |
TauZoolog | 3:25cd717ad782 | 257 | memset(LastInput, 0, sizeof(LastInput)); |
TauZoolog | 3:25cd717ad782 | 258 | memset(LLastInput, 0, sizeof(LLastInput)); |
TauZoolog | 3:25cd717ad782 | 259 | |
TauZoolog | 3:25cd717ad782 | 260 | // Input new use mode |
TauZoolog | 3:25cd717ad782 | 261 | isInputNotValid = 1; |
TauZoolog | 3:25cd717ad782 | 262 | while (isInputNotValid) { |
TauZoolog | 3:25cd717ad782 | 263 | printf("Please, select use mode: \n"); |
TauZoolog | 3:25cd717ad782 | 264 | printf("%d - IIRLPNORM filter\n", IIRLPNORM_FILTER_MODE); |
TauZoolog | 3:25cd717ad782 | 265 | printf("%d - High Pass filter\n", HIGH_PASS_FILTER_MODE); |
TauZoolog | 3:25cd717ad782 | 266 | printf("%d - No filter\n", NO_FILTER_MODE); |
TauZoolog | 3:25cd717ad782 | 267 | printf("%d - Predefined Output\n", PREDEFINED_OUTPUT_MODE); |
TauZoolog | 3:25cd717ad782 | 268 | printf("Input your choice or hit Enter to continue main loop in the same use mode: "); |
TauZoolog | 3:25cd717ad782 | 269 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 270 | gets(command); |
TauZoolog | 3:25cd717ad782 | 271 | // printf("Command:%s; command length:%d\n", command, strlen(command)); |
TauZoolog | 3:25cd717ad782 | 272 | if (strlen(command)-2 != 0 ) { |
TauZoolog | 3:25cd717ad782 | 273 | // convert characters to integer; if convertion not succeeded return 0 (i.e. IIRLPNORM_FILTER_MODE) |
TauZoolog | 3:25cd717ad782 | 274 | UseFilterMode = atoi(&command[strlen(command)-2]); |
TauZoolog | 3:25cd717ad782 | 275 | } |
TauZoolog | 3:25cd717ad782 | 276 | |
TauZoolog | 3:25cd717ad782 | 277 | if (UseFilterMode >= IIRLPNORM_FILTER_MODE && UseFilterMode <= PREDEFINED_OUTPUT_MODE) { |
TauZoolog | 3:25cd717ad782 | 278 | if (UseFilterMode == PREDEFINED_OUTPUT_MODE) { |
TauZoolog | 3:25cd717ad782 | 279 | printf("Enter signal amplitude threshold to start generate predefined signal (default - %d): ", SIGNAL_LOW_THRESHOD); |
TauZoolog | 3:25cd717ad782 | 280 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 281 | gets(command); |
TauZoolog | 3:25cd717ad782 | 282 | signal_low_threshold = atoi(command); |
TauZoolog | 3:25cd717ad782 | 283 | if (signal_low_threshold == 0) { |
TauZoolog | 3:25cd717ad782 | 284 | printf("\nWrong input - default is taken\n"); |
TauZoolog | 3:25cd717ad782 | 285 | signal_low_threshold = SIGNAL_LOW_THRESHOD; |
TauZoolog | 3:25cd717ad782 | 286 | } |
TauZoolog | 3:25cd717ad782 | 287 | |
TauZoolog | 3:25cd717ad782 | 288 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 289 | while (isSignalClipped) { |
TauZoolog | 3:25cd717ad782 | 290 | printf("Enter amplitude scale parameter for predefined signal (default - %5.2f): ", SCALE_FOR_PREDEFINED_OUTPUT); |
TauZoolog | 3:25cd717ad782 | 291 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 292 | gets(command); |
TauZoolog | 3:25cd717ad782 | 293 | scale_for_predefined_output = atof(command); |
TauZoolog | 3:25cd717ad782 | 294 | if (scale_for_predefined_output == float(0.0)) { |
TauZoolog | 3:25cd717ad782 | 295 | printf("\nWrong input - default is taken\n"); |
TauZoolog | 3:25cd717ad782 | 296 | scale_for_predefined_output = SCALE_FOR_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 297 | } |
TauZoolog | 3:25cd717ad782 | 298 | isSignalClipped = false; |
TauZoolog | 3:25cd717ad782 | 299 | for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) { |
TauZoolog | 3:25cd717ad782 | 300 | scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output; |
TauZoolog | 3:25cd717ad782 | 301 | if (scaled_sounddata[k] < (float)-1.0) { |
TauZoolog | 3:25cd717ad782 | 302 | scaled_sounddata[k] = (float)-1.0; |
TauZoolog | 3:25cd717ad782 | 303 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 304 | } |
TauZoolog | 3:25cd717ad782 | 305 | if (scaled_sounddata[k] > (float)1.0) { |
TauZoolog | 3:25cd717ad782 | 306 | scaled_sounddata[k] = (float)1.0; |
TauZoolog | 3:25cd717ad782 | 307 | isSignalClipped = true; |
TauZoolog | 3:25cd717ad782 | 308 | } |
TauZoolog | 3:25cd717ad782 | 309 | } |
TauZoolog | 3:25cd717ad782 | 310 | if (isSignalClipped) { |
TauZoolog | 3:25cd717ad782 | 311 | printf("With amplitude scale %5.2f, signal will be clipped !!!. Select smaller scale.\n",scale_for_predefined_output); |
TauZoolog | 3:25cd717ad782 | 312 | } |
TauZoolog | 3:25cd717ad782 | 313 | } // end of while (isSignalClipped) |
TauZoolog | 3:25cd717ad782 | 314 | printf("Enter delay after signal in microseconds (default - %d): ", DELAY_AFTER_SIGNAL_TRANSMISSION); |
TauZoolog | 3:25cd717ad782 | 315 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 316 | gets(command); |
TauZoolog | 3:25cd717ad782 | 317 | delay_after_signal_transmission = atoi(command); |
TauZoolog | 3:25cd717ad782 | 318 | if (delay_after_signal_transmission == 0) { |
TauZoolog | 3:25cd717ad782 | 319 | printf("\nWrong input - default is taken\n"); |
TauZoolog | 3:25cd717ad782 | 320 | delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION; |
TauZoolog | 3:25cd717ad782 | 321 | } |
TauZoolog | 3:25cd717ad782 | 322 | printf("Enter number of cycles to detect threshold crossing (default - %d): ", NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING); |
TauZoolog | 3:25cd717ad782 | 323 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 324 | gets(command); |
TauZoolog | 3:25cd717ad782 | 325 | num_of_cycles_to_detect_threshold_crossing = atoi(command); |
TauZoolog | 3:25cd717ad782 | 326 | if (num_of_cycles_to_detect_threshold_crossing == 0) { |
TauZoolog | 3:25cd717ad782 | 327 | printf("\nWrong input - default is taken\n"); |
TauZoolog | 3:25cd717ad782 | 328 | num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING; |
TauZoolog | 3:25cd717ad782 | 329 | } |
TauZoolog | 3:25cd717ad782 | 330 | printf("Use high pass filter with predefined output: Y/N (default - %s): ", |
TauZoolog | 3:25cd717ad782 | 331 | USE_FILTER_WITH_PREDEFINED_OUTPUT ? "Y" : "N" ); |
TauZoolog | 3:25cd717ad782 | 332 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 333 | gets(command); |
TauZoolog | 3:25cd717ad782 | 334 | if ((command[0] == 'Y') || (command[0] == 'y')) { |
TauZoolog | 3:25cd717ad782 | 335 | use_filter_with_predefined_output = true; |
TauZoolog | 3:25cd717ad782 | 336 | } else if ((command[0] == 'N') || (command[0] == 'n')) { |
TauZoolog | 3:25cd717ad782 | 337 | use_filter_with_predefined_output = false; |
TauZoolog | 3:25cd717ad782 | 338 | } else { |
TauZoolog | 3:25cd717ad782 | 339 | use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 340 | } |
TauZoolog | 3:25cd717ad782 | 341 | |
TauZoolog | 3:25cd717ad782 | 342 | if (delay_after_signal_transmission == 0) { |
TauZoolog | 3:25cd717ad782 | 343 | delay_after_signal_transmission = USE_FILTER_WITH_PREDEFINED_OUTPUT; |
TauZoolog | 3:25cd717ad782 | 344 | } |
TauZoolog | 3:25cd717ad782 | 345 | memset(command, 0, sizeof(command)); |
TauZoolog | 3:25cd717ad782 | 346 | } |
TauZoolog | 3:25cd717ad782 | 347 | isInputNotValid = 0; |
TauZoolog | 3:25cd717ad782 | 348 | } else if (UseFilterMode == TEST_OUTPUT_MODE) { |
TauZoolog | 3:25cd717ad782 | 349 | isInputNotValid = 0; |
TauZoolog | 3:25cd717ad782 | 350 | } else { |
TauZoolog | 3:25cd717ad782 | 351 | printf("\nWrong input - try again\n"); |
TauZoolog | 3:25cd717ad782 | 352 | } |
TauZoolog | 3:25cd717ad782 | 353 | } |
TauZoolog | 3:25cd717ad782 | 354 | LoopCount++; |
TauZoolog | 3:25cd717ad782 | 355 | print_parameters(); |
TauZoolog | 3:25cd717ad782 | 356 | |
TauZoolog | 3:25cd717ad782 | 357 | } // end while(True) |
TauZoolog | 3:25cd717ad782 | 358 | } |