Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

Committer:
Arkadi
Date:
Tue Jul 11 14:08:31 2017 +0000
Revision:
8:4a9979fe0122
Parent:
6:f14547e1cc04
Child:
9:6d4136d9c074
Finalizing operation modes.

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