Ultrasonic Audio File Player

Dependencies:   mbed

Fork of TAU_ZOOLOG_Chirp_Generator by Yossi_Students

Committer:
Arkadi
Date:
Mon Jul 10 14:30:48 2017 +0000
Revision:
6:f14547e1cc04
Parent:
5:65833e8cf4cf
Child:
8:4a9979fe0122
Updated saturation detector

Who changed what in which revision?

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