Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

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?

UserRevisionLine numberNew 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 }