Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

Committer:
Arkadi
Date:
Sun Aug 06 13:03:03 2017 +0000
Revision:
12:e2b4a11ebe5a
Parent:
9:6d4136d9c074
Child:
13:24d8512fc722
Code modifications, remove HPF, change trigger and sat

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 12:e2b4a11ebe5a 190 // set trigger state:
Arkadi 12:e2b4a11ebe5a 191 outPulse.write(0);
Arkadi 12:e2b4a11ebe5a 192
Arkadi 4:85dbf3e4d432 193 typedef void(*functionPtr)(void);
Arkadi 4:85dbf3e4d432 194 functionPtr FilterFunction;
Arkadi 4:85dbf3e4d432 195
Arkadi 4:85dbf3e4d432 196 // Assign ISR
Arkadi 4:85dbf3e4d432 197 mybutton.fall(&pressed);
Arkadi 4:85dbf3e4d432 198
Arkadi 4:85dbf3e4d432 199 LoopCount++;
Arkadi 4:85dbf3e4d432 200 print_parameters();
Arkadi 12:e2b4a11ebe5a 201
Arkadi 4:85dbf3e4d432 202 if (UseFilterMode == PREDEFINED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 203 // Prepare scaled sound data
Arkadi 4:85dbf3e4d432 204 isSignalClipped = false;
Arkadi 4:85dbf3e4d432 205 for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) {
Arkadi 4:85dbf3e4d432 206 scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output;
Arkadi 4:85dbf3e4d432 207 if (scaled_sounddata[k] < (float)-1.0) {
Arkadi 4:85dbf3e4d432 208 scaled_sounddata[k] = (float)-1.0;
Arkadi 4:85dbf3e4d432 209 isSignalClipped = true;
Arkadi 4:85dbf3e4d432 210 }
Arkadi 4:85dbf3e4d432 211 if (scaled_sounddata[k] > (float)1.0) {
Arkadi 4:85dbf3e4d432 212 scaled_sounddata[k] = (float)1.0;
Arkadi 4:85dbf3e4d432 213 isSignalClipped = true;
TauZoolog 3:25cd717ad782 214 }
TauZoolog 3:25cd717ad782 215 }
Arkadi 4:85dbf3e4d432 216 }
TauZoolog 3:25cd717ad782 217
Arkadi 4:85dbf3e4d432 218 // Infinite loop
Arkadi 4:85dbf3e4d432 219 while(true) {
Arkadi 4:85dbf3e4d432 220 switch (UseFilterMode) {
Arkadi 4:85dbf3e4d432 221 case IIRLPNORM_FILTER_MODE:
Arkadi 4:85dbf3e4d432 222 FilterFunction = iirlpnorm_filter;
Arkadi 5:65833e8cf4cf 223 printf("Running IIRLPNORM filter\r\n");
Arkadi 4:85dbf3e4d432 224 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 225 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 226 memset(LLastInput, 0, sizeof(LLastInput));
Arkadi 4:85dbf3e4d432 227 break;
Arkadi 4:85dbf3e4d432 228 // end of case IIRLPNORM_FILTER_MODE
TauZoolog 3:25cd717ad782 229
Arkadi 4:85dbf3e4d432 230 case HIGH_PASS_FILTER_MODE:
Arkadi 4:85dbf3e4d432 231 FilterFunction = highpath_filter;
Arkadi 5:65833e8cf4cf 232 printf("Running High Path filter\r\n");
Arkadi 4:85dbf3e4d432 233 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 234 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 235 memset(LLastInput, 0, sizeof(LLastInput));
Arkadi 4:85dbf3e4d432 236 break;
Arkadi 4:85dbf3e4d432 237 // end of case HIGH_PASS_FILTER_MODE
Arkadi 4:85dbf3e4d432 238
Arkadi 4:85dbf3e4d432 239 case PREDEFINED_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 240 FilterFunction = predefined_output;
Arkadi 5:65833e8cf4cf 241 printf("Running Predefined Output\r\n");
Arkadi 4:85dbf3e4d432 242 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 243 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 244 memset(LLastInput, 0, sizeof(LLastInput));
Arkadi 4:85dbf3e4d432 245 num_threshold_crossing = 0;
Arkadi 4:85dbf3e4d432 246 startPredefinedOutput = 0;
Arkadi 4:85dbf3e4d432 247 num_back_to_normal = 0;
Arkadi 4:85dbf3e4d432 248 break;
Arkadi 4:85dbf3e4d432 249 // end of case PREDEFINED_OUTPUT_MODE
Arkadi 4:85dbf3e4d432 250
Arkadi 4:85dbf3e4d432 251 case NO_FILTER_MODE:
Arkadi 4:85dbf3e4d432 252 FilterFunction = no_filter;
Arkadi 5:65833e8cf4cf 253 printf("Running No filter\r\n");
Arkadi 4:85dbf3e4d432 254 break;
Arkadi 4:85dbf3e4d432 255 // end of case NO_FILTER_MODE
TauZoolog 3:25cd717ad782 256
Arkadi 4:85dbf3e4d432 257 case TRIGGERED_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 258 FilterFunction = triggered_pass;
Arkadi 5:65833e8cf4cf 259 printf("Running Triggered Mode\r\n");
Arkadi 4:85dbf3e4d432 260 break;
Arkadi 4:85dbf3e4d432 261 // end of case Triggered Mode
Arkadi 4:85dbf3e4d432 262
Arkadi 4:85dbf3e4d432 263 case TEST_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 264 FilterFunction = test_output;
Arkadi 5:65833e8cf4cf 265 printf("Running test output\r\n");
Arkadi 4:85dbf3e4d432 266 break;
Arkadi 4:85dbf3e4d432 267 // end of case TEST_OUTPUT_MODE
Arkadi 4:85dbf3e4d432 268
Arkadi 4:85dbf3e4d432 269 default:
Arkadi 4:85dbf3e4d432 270 printf("Wrong User Filter Mode");
Arkadi 4:85dbf3e4d432 271 // Default - no filter
Arkadi 4:85dbf3e4d432 272 FilterFunction = no_filter;
Arkadi 5:65833e8cf4cf 273 printf("No filter\r\n");
Arkadi 4:85dbf3e4d432 274 break;
Arkadi 4:85dbf3e4d432 275
Arkadi 4:85dbf3e4d432 276 } // end of switch (UserFilterMode)
TauZoolog 3:25cd717ad782 277
Arkadi 4:85dbf3e4d432 278 UserButtonPressed = 1;
Arkadi 4:85dbf3e4d432 279 NumCycles = 0;
Arkadi 4:85dbf3e4d432 280 ADCValueMax = 0;
Arkadi 4:85dbf3e4d432 281 ADCValueMin = 0xfff;
TauZoolog 3:25cd717ad782 282
Arkadi 4:85dbf3e4d432 283 // ====================================================
Arkadi 4:85dbf3e4d432 284 // Start signal processing
Arkadi 4:85dbf3e4d432 285 while(UserButtonPressed) {
Arkadi 4:85dbf3e4d432 286 FilterFunction();
Arkadi 4:85dbf3e4d432 287 NumCycles++;
Arkadi 4:85dbf3e4d432 288 // Check keyboard input each NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT cycles
Arkadi 4:85dbf3e4d432 289 if((NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT > 0) && (NumCycles % NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT == 0)) {
Arkadi 4:85dbf3e4d432 290 // printf("Check keyboard input. Cycle: %d\n", NumCycles);
Arkadi 4:85dbf3e4d432 291 UserButtonPressed = checkKeyboardInput();
Arkadi 4:85dbf3e4d432 292 }
Arkadi 4:85dbf3e4d432 293 } // end of while(UserButtonPressed)
Arkadi 4:85dbf3e4d432 294 // End of signal processing
Arkadi 4:85dbf3e4d432 295 // ====================================================
Arkadi 4:85dbf3e4d432 296
Arkadi 4:85dbf3e4d432 297 // User button pressed
Arkadi 4:85dbf3e4d432 298 // Main loop working with ADC/DAC is stopped
Arkadi 4:85dbf3e4d432 299 // Here should be functionality which should be done before start another loop with ADC/DAC
Arkadi 5:65833e8cf4cf 300 printf("\nKeyboard key or User button pressed! Exit from main loop.\r\n");
Arkadi 4:85dbf3e4d432 301
Arkadi 4:85dbf3e4d432 302 // Init filter variables
Arkadi 4:85dbf3e4d432 303 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 304 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 305 memset(LLastInput, 0, sizeof(LLastInput));
TauZoolog 3:25cd717ad782 306
Arkadi 4:85dbf3e4d432 307 // Input new use mode
Arkadi 4:85dbf3e4d432 308 isInputNotValid = 1;
Arkadi 4:85dbf3e4d432 309 while (isInputNotValid) {
Arkadi 5:65833e8cf4cf 310 printf("Please, select use mode: \r\n");
Arkadi 5:65833e8cf4cf 311 printf("%d - IIRLPNORM filter\r\n", IIRLPNORM_FILTER_MODE);
Arkadi 5:65833e8cf4cf 312 printf("%d - High Pass filter\r\n", HIGH_PASS_FILTER_MODE);
Arkadi 5:65833e8cf4cf 313 printf("%d - No filter\r\n", NO_FILTER_MODE);
Arkadi 5:65833e8cf4cf 314 printf("%d - Predefined Output\r\n", PREDEFINED_OUTPUT_MODE);
Arkadi 5:65833e8cf4cf 315 printf("%d - Triggered Mode \r\n", TRIGGERED_OUTPUT_MODE);
Arkadi 4:85dbf3e4d432 316 printf("Input your choice or hit Enter to continue main loop in the same use mode: ");
Arkadi 4:85dbf3e4d432 317 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 318 gets(command);
Arkadi 4:85dbf3e4d432 319 // printf("Command:%s; command length:%d\n", command, strlen(command));
Arkadi 4:85dbf3e4d432 320 if (strlen(command)-2 != 0 ) {
Arkadi 4:85dbf3e4d432 321 // convert characters to integer; if convertion not succeeded return 0 (i.e. IIRLPNORM_FILTER_MODE)
Arkadi 4:85dbf3e4d432 322 UseFilterMode = atoi(&command[strlen(command)-2]);
Arkadi 4:85dbf3e4d432 323 }
TauZoolog 3:25cd717ad782 324
Arkadi 4:85dbf3e4d432 325 if (UseFilterMode >= IIRLPNORM_FILTER_MODE && UseFilterMode <= TRIGGERED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 326 if (UseFilterMode == PREDEFINED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 327 printf("Enter signal amplitude threshold to start generate predefined signal (default - %d): ", SIGNAL_LOW_THRESHOD);
Arkadi 4:85dbf3e4d432 328 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 329 gets(command);
Arkadi 4:85dbf3e4d432 330 signal_low_threshold = atoi(command);
Arkadi 4:85dbf3e4d432 331 if (signal_low_threshold == 0) {
Arkadi 5:65833e8cf4cf 332 printf("\r\nWrong input - default is taken\r\n");
Arkadi 4:85dbf3e4d432 333 signal_low_threshold = SIGNAL_LOW_THRESHOD;
Arkadi 4:85dbf3e4d432 334 }
Arkadi 9:6d4136d9c074 335
Arkadi 9:6d4136d9c074 336 // not used //
Arkadi 9:6d4136d9c074 337 // isSignalClipped = true;
Arkadi 9:6d4136d9c074 338 // while (isSignalClipped) {
Arkadi 9:6d4136d9c074 339 // printf("Enter amplitude scale parameter for predefined signal (default - %5.2f): ", SCALE_FOR_PREDEFINED_OUTPUT);
Arkadi 9:6d4136d9c074 340 // memset(command, 0, sizeof(command));
Arkadi 9:6d4136d9c074 341 // gets(command);
Arkadi 9:6d4136d9c074 342 // scale_for_predefined_output = atof(command);
Arkadi 9:6d4136d9c074 343 // if (scale_for_predefined_output == float(0.0)) {
Arkadi 9:6d4136d9c074 344 // printf("\r\nWrong input - default is taken\r\n");
Arkadi 9:6d4136d9c074 345 // scale_for_predefined_output = SCALE_FOR_PREDEFINED_OUTPUT;
Arkadi 9:6d4136d9c074 346 // }
Arkadi 9:6d4136d9c074 347 // isSignalClipped = false;
Arkadi 9:6d4136d9c074 348 // for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) {
Arkadi 9:6d4136d9c074 349 // scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output;
Arkadi 9:6d4136d9c074 350 // if (scaled_sounddata[k] < (float)-1.0) {
Arkadi 9:6d4136d9c074 351 // scaled_sounddata[k] = (float)-1.0;
Arkadi 9:6d4136d9c074 352 // isSignalClipped = true;
Arkadi 9:6d4136d9c074 353 // }
Arkadi 9:6d4136d9c074 354 // if (scaled_sounddata[k] > (float)1.0) {
Arkadi 9:6d4136d9c074 355 // scaled_sounddata[k] = (float)1.0;
Arkadi 9:6d4136d9c074 356 // isSignalClipped = true;
Arkadi 9:6d4136d9c074 357 // }
Arkadi 9:6d4136d9c074 358 // }
Arkadi 9:6d4136d9c074 359 // if (isSignalClipped) {
Arkadi 9:6d4136d9c074 360 // printf("With amplitude scale %5.2f, signal will be clipped !!!. Select smaller scale.\r\n",scale_for_predefined_output);
Arkadi 9:6d4136d9c074 361 // }
Arkadi 9:6d4136d9c074 362 // } // end of while (isSignalClipped)
TauZoolog 3:25cd717ad782 363
Arkadi 4:85dbf3e4d432 364 printf("Enter delay after signal in microseconds (default - %d): ", DELAY_AFTER_SIGNAL_TRANSMISSION);
Arkadi 4:85dbf3e4d432 365 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 366 gets(command);
Arkadi 4:85dbf3e4d432 367 delay_after_signal_transmission = atoi(command);
Arkadi 4:85dbf3e4d432 368 if (delay_after_signal_transmission == 0) {
Arkadi 5:65833e8cf4cf 369 printf("\r\nWrong input - default is taken\r\n");
Arkadi 4:85dbf3e4d432 370 delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION;
Arkadi 4:85dbf3e4d432 371 }
Arkadi 9:6d4136d9c074 372 // printf("Enter number of cycles to detect threshold crossing (default - %d): ", NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING);
Arkadi 9:6d4136d9c074 373 // memset(command, 0, sizeof(command));
Arkadi 9:6d4136d9c074 374 // gets(command);
Arkadi 9:6d4136d9c074 375 // num_of_cycles_to_detect_threshold_crossing = atoi(command);
Arkadi 9:6d4136d9c074 376 // if (num_of_cycles_to_detect_threshold_crossing == 0) {
Arkadi 9:6d4136d9c074 377 // printf("\r\nWrong input - default is taken\r\n");
Arkadi 9:6d4136d9c074 378 // num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING;
Arkadi 9:6d4136d9c074 379 // }
Arkadi 9:6d4136d9c074 380 // not implemeted filter not activated //
Arkadi 9:6d4136d9c074 381 //printf("Use high pass filter with predefined output: Y/N (default - %s): ",
Arkadi 9:6d4136d9c074 382 // USE_FILTER_WITH_PREDEFINED_OUTPUT ? "Y" : "N" );
Arkadi 9:6d4136d9c074 383 // memset(command, 0, sizeof(command));
Arkadi 9:6d4136d9c074 384 // gets(command);
Arkadi 9:6d4136d9c074 385 // if ((command[0] == 'Y') || (command[0] == 'y')) {
Arkadi 9:6d4136d9c074 386 // use_filter_with_predefined_output = true;
Arkadi 9:6d4136d9c074 387 // } else if ((command[0] == 'N') || (command[0] == 'n')) {
Arkadi 9:6d4136d9c074 388 // use_filter_with_predefined_output = false;
Arkadi 9:6d4136d9c074 389 // } else {
Arkadi 9:6d4136d9c074 390 // use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT;
Arkadi 9:6d4136d9c074 391 // }
Arkadi 9:6d4136d9c074 392 //
Arkadi 9:6d4136d9c074 393 // if (delay_after_signal_transmission == 0) {
Arkadi 9:6d4136d9c074 394 // delay_after_signal_transmission = USE_FILTER_WITH_PREDEFINED_OUTPUT;
Arkadi 9:6d4136d9c074 395 // }
Arkadi 9:6d4136d9c074 396 // memset(command, 0, sizeof(command));
TauZoolog 3:25cd717ad782 397
Arkadi 5:65833e8cf4cf 398 isInputNotValid = 0;
Arkadi 5:65833e8cf4cf 399 } else if (UseFilterMode == TEST_OUTPUT_MODE) {
Arkadi 5:65833e8cf4cf 400 isInputNotValid = 0;
Arkadi 9:6d4136d9c074 401 } else if (UseFilterMode == NO_FILTER_MODE) {
Arkadi 9:6d4136d9c074 402 isInputNotValid = 0;
Arkadi 9:6d4136d9c074 403 } else if (UseFilterMode == HIGH_PASS_FILTER_MODE) {
Arkadi 9:6d4136d9c074 404 isInputNotValid = 0;
Arkadi 5:65833e8cf4cf 405 } else if (UseFilterMode == TRIGGERED_OUTPUT_MODE) {
Arkadi 5:65833e8cf4cf 406
Arkadi 5:65833e8cf4cf 407 // define threshold
Arkadi 5:65833e8cf4cf 408 printf("Enter signal trigger threshold (default - %f): ", TRIGGER_THRESHOLD_VALUE);
Arkadi 5:65833e8cf4cf 409 memset(command, 0, sizeof(command));
Arkadi 5:65833e8cf4cf 410 gets(command);
Arkadi 5:65833e8cf4cf 411 triggThresholdValue = atof(command);
Arkadi 5:65833e8cf4cf 412 if (triggThresholdValue == 0) {
Arkadi 5:65833e8cf4cf 413 printf("\r\nWrong input - default is taken\r\n");
Arkadi 5:65833e8cf4cf 414 triggThresholdValue = TRIGGER_THRESHOLD_VALUE;
Arkadi 5:65833e8cf4cf 415 }
Arkadi 5:65833e8cf4cf 416 printf("\r\nChosen - %f\r\n",triggThresholdValue);
Arkadi 5:65833e8cf4cf 417
Arkadi 5:65833e8cf4cf 418 // define record time
Arkadi 5:65833e8cf4cf 419 printf("Enter record time (millis) (default - %f): ", SAMPLE_LENGTH);
Arkadi 5:65833e8cf4cf 420 memset(command, 0, sizeof(command));
Arkadi 5:65833e8cf4cf 421 gets(command);
Arkadi 5:65833e8cf4cf 422 sample_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples
Arkadi 5:65833e8cf4cf 423 if (sample_length == 0) {
Arkadi 5:65833e8cf4cf 424 printf("\r\nWrong input - default is taken\r\n");
Arkadi 5:65833e8cf4cf 425 sample_length = SAMPLE_LENGTH*(SampleRate/1000.0f);
Arkadi 5:65833e8cf4cf 426 }
Arkadi 5:65833e8cf4cf 427 printf("\r\n Signal samples - %f\r\n",sample_length);
Arkadi 5:65833e8cf4cf 428
Arkadi 5:65833e8cf4cf 429 // define silence time
Arkadi 5:65833e8cf4cf 430 printf("Enter silence time (millis) (default - %f): ", QUIET_LENGTH);
Arkadi 5:65833e8cf4cf 431 memset(command, 0, sizeof(command));
Arkadi 5:65833e8cf4cf 432 gets(command);
Arkadi 5:65833e8cf4cf 433 quiet_length = atof(command)*(SampleRate/1000.0f); // compansation for number of samples
Arkadi 5:65833e8cf4cf 434 if (quiet_length == 0) {
Arkadi 5:65833e8cf4cf 435 printf("\r\nWrong input - default is taken\r\n");
Arkadi 5:65833e8cf4cf 436 quiet_length = QUIET_LENGTH*(SampleRate/1000.0f);
Arkadi 5:65833e8cf4cf 437 }
Arkadi 5:65833e8cf4cf 438 printf("\r\n silence samples - %f\r\n",quiet_length);
Arkadi 6:f14547e1cc04 439
Arkadi 5:65833e8cf4cf 440 // enable TRIGGER HPF
Arkadi 5:65833e8cf4cf 441 printf("Enter enable trigger HPF (default - %d): ", TRIGGER_HPF);
Arkadi 5:65833e8cf4cf 442 memset(command, 0, sizeof(command));
Arkadi 5:65833e8cf4cf 443 gets(command);
Arkadi 5:65833e8cf4cf 444 trigger_HPF = (bool)atoi(command);
Arkadi 5:65833e8cf4cf 445 printf("\r\nChosen - %d\r\n",trigger_HPF);
Arkadi 5:65833e8cf4cf 446
Arkadi 8:4a9979fe0122 447 // enable Saturation Detector
Arkadi 8:4a9979fe0122 448 printf("Enter enable Saturation Detection (default - %d): ", SATURATION_DETECTION);
Arkadi 6:f14547e1cc04 449 memset(command, 0, sizeof(command));
Arkadi 6:f14547e1cc04 450 gets(command);
Arkadi 8:4a9979fe0122 451 saturation_detection = (bool)atoi(command);
Arkadi 8:4a9979fe0122 452 printf("\r\nChosen - %d\r\n",saturation_detection);
Arkadi 9:6d4136d9c074 453
Arkadi 8:4a9979fe0122 454 // no point asking quations if not enabled
Arkadi 8:4a9979fe0122 455 if (saturation_detection) {
Arkadi 8:4a9979fe0122 456 // set saturation threshold
Arkadi 8:4a9979fe0122 457 printf("Enter Saturation threshold (default - %f): ", SATURATION_THRESHOLD);
Arkadi 8:4a9979fe0122 458 memset(command, 0, sizeof(command));
Arkadi 8:4a9979fe0122 459 gets(command);
Arkadi 8:4a9979fe0122 460 saturation_threshold =atof(command);
Arkadi 8:4a9979fe0122 461 if (saturation_threshold <= 0) {
Arkadi 8:4a9979fe0122 462 printf("\r\nWrong input - default is taken\r\n");
Arkadi 8:4a9979fe0122 463 saturation_threshold = SATURATION_THRESHOLD;
Arkadi 8:4a9979fe0122 464 }
Arkadi 8:4a9979fe0122 465 printf("\r\nChosen - %f \r\n",saturation_threshold);
Arkadi 6:f14547e1cc04 466
Arkadi 8:4a9979fe0122 467 // set saturation sample numbers
Arkadi 8:4a9979fe0122 468 printf("Enter Saturation sample number (default - %d): ", NUM_SATURATION_SAMPLES);
Arkadi 8:4a9979fe0122 469 memset(command, 0, sizeof(command));
Arkadi 8:4a9979fe0122 470 gets(command);
Arkadi 8:4a9979fe0122 471 num_saturation_samples =atoi(command);
Arkadi 8:4a9979fe0122 472 if (num_saturation_samples == 0) {
Arkadi 8:4a9979fe0122 473 printf("\r\nWrong input - default is taken\r\n");
Arkadi 8:4a9979fe0122 474 num_saturation_samples = NUM_SATURATION_SAMPLES;
Arkadi 8:4a9979fe0122 475 }
Arkadi 8:4a9979fe0122 476 printf("\r\nChosen - %d\r\n",num_saturation_samples);
Arkadi 8:4a9979fe0122 477
Arkadi 8:4a9979fe0122 478
Arkadi 8:4a9979fe0122 479 // set saturation delay period
Arkadi 8:4a9979fe0122 480 printf("Enter Saturation delay in millis (default - %d): ", SATURATION_DELAY);
Arkadi 8:4a9979fe0122 481 memset(command, 0, sizeof(command));
Arkadi 8:4a9979fe0122 482 gets(command);
Arkadi 8:4a9979fe0122 483 float saturation_delay_float =atof(command);
Arkadi 8:4a9979fe0122 484 if (saturation_delay_float <= 0) {
Arkadi 8:4a9979fe0122 485 printf("\r\nWrong input - default is taken\r\n");
Arkadi 8:4a9979fe0122 486 saturation_delay_float = SATURATION_DELAY;
Arkadi 8:4a9979fe0122 487 }
Arkadi 8:4a9979fe0122 488 saturation_delay=(uint32_t)(saturation_delay_float*OPERATION_MS);
Arkadi 8:4a9979fe0122 489 printf("\r\nChosen - %f , delay in cycle number %d \r\n",saturation_delay_float,saturation_delay);
Arkadi 6:f14547e1cc04 490 }
Arkadi 5:65833e8cf4cf 491 // finish parameter settings
Arkadi 5:65833e8cf4cf 492 isInputNotValid = 0;
Arkadi 5:65833e8cf4cf 493 } else {
Arkadi 5:65833e8cf4cf 494 printf("\r\nWrong input - try again\r\n");
TauZoolog 3:25cd717ad782 495 }
Arkadi 4:85dbf3e4d432 496 }
Arkadi 5:65833e8cf4cf 497 LoopCount++;
Arkadi 5:65833e8cf4cf 498 print_parameters();
TauZoolog 3:25cd717ad782 499
Arkadi 5:65833e8cf4cf 500 } // end while(True)
Arkadi 5:65833e8cf4cf 501 }
Arkadi 4:85dbf3e4d432 502 }