Chirp Signal Generator

Dependencies:   mbed

Fork of TAU_ZOOLOG_Playback_Rev1_1 by Yossi_Students

Committer:
Arkadi
Date:
Sun Jul 09 14:06:17 2017 +0000
Revision:
4:85dbf3e4d432
Parent:
3:25cd717ad782
Child:
5:65833e8cf4cf
Mid process commit

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 4:85dbf3e4d432 93
Arkadi 4:85dbf3e4d432 94 // high pass variables
Arkadi 4:85dbf3e4d432 95 // high pass
Arkadi 4:85dbf3e4d432 96 // tau=RC=1/2pif
Arkadi 4:85dbf3e4d432 97 // α := RC / (RC + dt) :=Tau/(Tau+dt)
Arkadi 4:85dbf3e4d432 98 // y[0] := x[0]
Arkadi 4:85dbf3e4d432 99 // y[i] := α * y[i-1] + α * (x[i] - x[i-1])
Arkadi 4:85dbf3e4d432 100 // AHPF=ALPHA
Arkadi 4:85dbf3e4d432 101
Arkadi 4:85dbf3e4d432 102 float Tau=TAU_AHPF; // time constat of the filter, (1khz -> 0.001 second)
Arkadi 4:85dbf3e4d432 103 float AHPF=Tau/(Tau+1.0f/SampleRate);
Arkadi 4:85dbf3e4d432 104 float LastY=0;
Arkadi 4:85dbf3e4d432 105 float CurY=0;
Arkadi 4:85dbf3e4d432 106 float LastU=0;
Arkadi 4:85dbf3e4d432 107 float CurU=0;
Arkadi 4:85dbf3e4d432 108
Arkadi 4:85dbf3e4d432 109
TauZoolog 3:25cd717ad782 110 inline void NOP()
TauZoolog 3:25cd717ad782 111 {
TauZoolog 3:25cd717ad782 112 __ASM volatile ("nop"); // one tick operation, Use to adjust frequency by slowing down the proccess
TauZoolog 3:25cd717ad782 113 }
TauZoolog 3:25cd717ad782 114
TauZoolog 3:25cd717ad782 115 // User Button Interrupt Service Routine (ISR)
TauZoolog 3:25cd717ad782 116 void pressed()
TauZoolog 3:25cd717ad782 117 {
TauZoolog 3:25cd717ad782 118 UserButtonPressed = 0;
TauZoolog 3:25cd717ad782 119 }
TauZoolog 3:25cd717ad782 120
TauZoolog 3:25cd717ad782 121 int checkKeyboardInput(void)
TauZoolog 3:25cd717ad782 122 {
TauZoolog 3:25cd717ad782 123 if (pc.readable())
TauZoolog 3:25cd717ad782 124 return 0; // means has input
TauZoolog 3:25cd717ad782 125 else
TauZoolog 3:25cd717ad782 126 return 1; // means no input
TauZoolog 3:25cd717ad782 127 }
TauZoolog 3:25cd717ad782 128
TauZoolog 3:25cd717ad782 129 #include "adc_init.h"
TauZoolog 3:25cd717ad782 130
TauZoolog 3:25cd717ad782 131 #include "iirlpnorm_filter.h"
TauZoolog 3:25cd717ad782 132
TauZoolog 3:25cd717ad782 133 #include "high_path_filter.h"
TauZoolog 3:25cd717ad782 134
TauZoolog 3:25cd717ad782 135 #include "no_filter.h"
TauZoolog 3:25cd717ad782 136
TauZoolog 3:25cd717ad782 137 #include "predefined_output.h"
TauZoolog 3:25cd717ad782 138
Arkadi 4:85dbf3e4d432 139 #include "triggered_pass.h"
Arkadi 4:85dbf3e4d432 140
TauZoolog 3:25cd717ad782 141 void print_parameters()
TauZoolog 3:25cd717ad782 142 {
TauZoolog 3:25cd717ad782 143 printf("\n%s Digital Filter.\nSTART MAIN LOOP, use mode %d, loop #%d, number of sections: %d\n",
TauZoolog 3:25cd717ad782 144 FilterType[UseFilterMode], UseFilterMode, LoopCount,
TauZoolog 3:25cd717ad782 145 (UseFilterMode == IIRLPNORM_FILTER_MODE) ? NumSections : NumSectionsHP);
TauZoolog 3:25cd717ad782 146 if (UseFilterMode == PREDEFINED_OUTPUT_MODE) {
TauZoolog 3:25cd717ad782 147 printf("Signal threshould: %d\nSignal scale: %5.2f\nNumber of cycles to detect threshold crossing: %d\nDelay after signal in microseconds: %d\nUse filter: %s\n",
TauZoolog 3:25cd717ad782 148 signal_low_threshold, scale_for_predefined_output, num_of_cycles_to_detect_threshold_crossing, delay_after_signal_transmission,
TauZoolog 3:25cd717ad782 149 use_filter_with_predefined_output ? "Y" : "N");
TauZoolog 3:25cd717ad782 150 }
TauZoolog 3:25cd717ad782 151 }
TauZoolog 3:25cd717ad782 152
TauZoolog 3:25cd717ad782 153 // Main procedure
Arkadi 4:85dbf3e4d432 154 int main()
Arkadi 4:85dbf3e4d432 155 {
Arkadi 4:85dbf3e4d432 156 char command[64];
Arkadi 4:85dbf3e4d432 157 int isInputNotValid;
Arkadi 4:85dbf3e4d432 158 int k;
Arkadi 4:85dbf3e4d432 159 bool isSignalClipped = false;
TauZoolog 3:25cd717ad782 160
Arkadi 4:85dbf3e4d432 161 strcpy(FilterType[0], "IIRLPNORM filter");
Arkadi 4:85dbf3e4d432 162 strcpy(FilterType[1], "High Pass filter");
Arkadi 4:85dbf3e4d432 163 strcpy(FilterType[2], "No filter");
Arkadi 4:85dbf3e4d432 164 strcpy(FilterType[3], "Predefined Output");
Arkadi 4:85dbf3e4d432 165 strcpy(FilterType[4], "Test Output");
TauZoolog 3:25cd717ad782 166
Arkadi 4:85dbf3e4d432 167 ADC1_Init();
Arkadi 4:85dbf3e4d432 168 DAC1_Init();
TauZoolog 3:25cd717ad782 169
Arkadi 4:85dbf3e4d432 170 HAL_ADC_Start(&hadc1);
Arkadi 4:85dbf3e4d432 171 HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
TauZoolog 3:25cd717ad782 172
Arkadi 4:85dbf3e4d432 173 // define Dac Register for direct method of setting DAC value`s
Arkadi 4:85dbf3e4d432 174 Dac_Reg = (uint32_t) (hdac1.Instance);
Arkadi 4:85dbf3e4d432 175 Dac_Reg += __HAL_DHR12R1_ALIGNEMENT(DAC_ALIGN_12B_R);
TauZoolog 3:25cd717ad782 176
Arkadi 4:85dbf3e4d432 177 typedef void(*functionPtr)(void);
Arkadi 4:85dbf3e4d432 178 functionPtr FilterFunction;
Arkadi 4:85dbf3e4d432 179
Arkadi 4:85dbf3e4d432 180 // Assign ISR
Arkadi 4:85dbf3e4d432 181 mybutton.fall(&pressed);
Arkadi 4:85dbf3e4d432 182
Arkadi 4:85dbf3e4d432 183 LoopCount++;
Arkadi 4:85dbf3e4d432 184 print_parameters();
TauZoolog 3:25cd717ad782 185
Arkadi 4:85dbf3e4d432 186 if (UseFilterMode == PREDEFINED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 187 // Prepare scaled sound data
Arkadi 4:85dbf3e4d432 188 isSignalClipped = false;
Arkadi 4:85dbf3e4d432 189 for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) {
Arkadi 4:85dbf3e4d432 190 scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output;
Arkadi 4:85dbf3e4d432 191 if (scaled_sounddata[k] < (float)-1.0) {
Arkadi 4:85dbf3e4d432 192 scaled_sounddata[k] = (float)-1.0;
Arkadi 4:85dbf3e4d432 193 isSignalClipped = true;
Arkadi 4:85dbf3e4d432 194 }
Arkadi 4:85dbf3e4d432 195 if (scaled_sounddata[k] > (float)1.0) {
Arkadi 4:85dbf3e4d432 196 scaled_sounddata[k] = (float)1.0;
Arkadi 4:85dbf3e4d432 197 isSignalClipped = true;
TauZoolog 3:25cd717ad782 198 }
TauZoolog 3:25cd717ad782 199 }
Arkadi 4:85dbf3e4d432 200 }
TauZoolog 3:25cd717ad782 201
Arkadi 4:85dbf3e4d432 202 // Infinite loop
Arkadi 4:85dbf3e4d432 203 while(true) {
Arkadi 4:85dbf3e4d432 204 switch (UseFilterMode) {
Arkadi 4:85dbf3e4d432 205 case IIRLPNORM_FILTER_MODE:
Arkadi 4:85dbf3e4d432 206 FilterFunction = iirlpnorm_filter;
Arkadi 4:85dbf3e4d432 207 printf("Running IIRLPNORM filter\n");
Arkadi 4:85dbf3e4d432 208 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 209 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 210 memset(LLastInput, 0, sizeof(LLastInput));
Arkadi 4:85dbf3e4d432 211 break;
Arkadi 4:85dbf3e4d432 212 // end of case IIRLPNORM_FILTER_MODE
TauZoolog 3:25cd717ad782 213
Arkadi 4:85dbf3e4d432 214 case HIGH_PASS_FILTER_MODE:
Arkadi 4:85dbf3e4d432 215 FilterFunction = highpath_filter;
Arkadi 4:85dbf3e4d432 216 printf("Running High Path filter\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 HIGH_PASS_FILTER_MODE
Arkadi 4:85dbf3e4d432 222
Arkadi 4:85dbf3e4d432 223 case PREDEFINED_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 224 FilterFunction = predefined_output;
Arkadi 4:85dbf3e4d432 225 printf("Running Predefined Output\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 num_threshold_crossing = 0;
Arkadi 4:85dbf3e4d432 230 startPredefinedOutput = 0;
Arkadi 4:85dbf3e4d432 231 num_back_to_normal = 0;
Arkadi 4:85dbf3e4d432 232 break;
Arkadi 4:85dbf3e4d432 233 // end of case PREDEFINED_OUTPUT_MODE
Arkadi 4:85dbf3e4d432 234
Arkadi 4:85dbf3e4d432 235 case NO_FILTER_MODE:
Arkadi 4:85dbf3e4d432 236 FilterFunction = no_filter;
Arkadi 4:85dbf3e4d432 237 printf("Running No filter\n");
Arkadi 4:85dbf3e4d432 238 break;
Arkadi 4:85dbf3e4d432 239 // end of case NO_FILTER_MODE
TauZoolog 3:25cd717ad782 240
Arkadi 4:85dbf3e4d432 241 case TRIGGERED_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 242 FilterFunction = triggered_pass;
Arkadi 4:85dbf3e4d432 243 printf("Running Triggered Mode\n");
Arkadi 4:85dbf3e4d432 244 break;
Arkadi 4:85dbf3e4d432 245 // end of case Triggered Mode
Arkadi 4:85dbf3e4d432 246
Arkadi 4:85dbf3e4d432 247 case TEST_OUTPUT_MODE:
Arkadi 4:85dbf3e4d432 248 FilterFunction = test_output;
Arkadi 4:85dbf3e4d432 249 printf("Running test output\n");
Arkadi 4:85dbf3e4d432 250 break;
Arkadi 4:85dbf3e4d432 251 // end of case TEST_OUTPUT_MODE
Arkadi 4:85dbf3e4d432 252
Arkadi 4:85dbf3e4d432 253 default:
Arkadi 4:85dbf3e4d432 254 printf("Wrong User Filter Mode");
Arkadi 4:85dbf3e4d432 255 // Default - no filter
Arkadi 4:85dbf3e4d432 256 FilterFunction = no_filter;
Arkadi 4:85dbf3e4d432 257 printf("No filter\n");
Arkadi 4:85dbf3e4d432 258 break;
Arkadi 4:85dbf3e4d432 259
Arkadi 4:85dbf3e4d432 260 } // end of switch (UserFilterMode)
TauZoolog 3:25cd717ad782 261
Arkadi 4:85dbf3e4d432 262 UserButtonPressed = 1;
Arkadi 4:85dbf3e4d432 263 NumCycles = 0;
Arkadi 4:85dbf3e4d432 264 ADCValueMax = 0;
Arkadi 4:85dbf3e4d432 265 ADCValueMin = 0xfff;
TauZoolog 3:25cd717ad782 266
Arkadi 4:85dbf3e4d432 267 // ====================================================
Arkadi 4:85dbf3e4d432 268 // Start signal processing
Arkadi 4:85dbf3e4d432 269 while(UserButtonPressed) {
Arkadi 4:85dbf3e4d432 270 FilterFunction();
Arkadi 4:85dbf3e4d432 271 NumCycles++;
Arkadi 4:85dbf3e4d432 272 // Check keyboard input each NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT cycles
Arkadi 4:85dbf3e4d432 273 if((NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT > 0) && (NumCycles % NUM_CYCLES_TO_CHECK_KEYBOARD_INPUT == 0)) {
Arkadi 4:85dbf3e4d432 274 // printf("Check keyboard input. Cycle: %d\n", NumCycles);
Arkadi 4:85dbf3e4d432 275 UserButtonPressed = checkKeyboardInput();
Arkadi 4:85dbf3e4d432 276 }
Arkadi 4:85dbf3e4d432 277 } // end of while(UserButtonPressed)
Arkadi 4:85dbf3e4d432 278 // End of signal processing
Arkadi 4:85dbf3e4d432 279 // ====================================================
Arkadi 4:85dbf3e4d432 280
Arkadi 4:85dbf3e4d432 281 // User button pressed
Arkadi 4:85dbf3e4d432 282 // Main loop working with ADC/DAC is stopped
Arkadi 4:85dbf3e4d432 283 // Here should be functionality which should be done before start another loop with ADC/DAC
Arkadi 4:85dbf3e4d432 284 printf("\nKeyboard key or User button pressed! Exit from main loop.\n");
Arkadi 4:85dbf3e4d432 285
Arkadi 4:85dbf3e4d432 286 // Init filter variables
Arkadi 4:85dbf3e4d432 287 memset(CurrInput, 0, sizeof(CurrInput));
Arkadi 4:85dbf3e4d432 288 memset(LastInput, 0, sizeof(LastInput));
Arkadi 4:85dbf3e4d432 289 memset(LLastInput, 0, sizeof(LLastInput));
TauZoolog 3:25cd717ad782 290
Arkadi 4:85dbf3e4d432 291 // Input new use mode
Arkadi 4:85dbf3e4d432 292 isInputNotValid = 1;
Arkadi 4:85dbf3e4d432 293 while (isInputNotValid) {
Arkadi 4:85dbf3e4d432 294 printf("Please, select use mode: \n");
Arkadi 4:85dbf3e4d432 295 printf("%d - IIRLPNORM filter\n", IIRLPNORM_FILTER_MODE);
Arkadi 4:85dbf3e4d432 296 printf("%d - High Pass filter\n", HIGH_PASS_FILTER_MODE);
Arkadi 4:85dbf3e4d432 297 printf("%d - No filter\n", NO_FILTER_MODE);
Arkadi 4:85dbf3e4d432 298 printf("%d - Predefined Output\n", PREDEFINED_OUTPUT_MODE);
Arkadi 4:85dbf3e4d432 299 printf("Input your choice or hit Enter to continue main loop in the same use mode: ");
Arkadi 4:85dbf3e4d432 300 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 301 gets(command);
Arkadi 4:85dbf3e4d432 302 // printf("Command:%s; command length:%d\n", command, strlen(command));
Arkadi 4:85dbf3e4d432 303 if (strlen(command)-2 != 0 ) {
Arkadi 4:85dbf3e4d432 304 // convert characters to integer; if convertion not succeeded return 0 (i.e. IIRLPNORM_FILTER_MODE)
Arkadi 4:85dbf3e4d432 305 UseFilterMode = atoi(&command[strlen(command)-2]);
Arkadi 4:85dbf3e4d432 306 }
TauZoolog 3:25cd717ad782 307
Arkadi 4:85dbf3e4d432 308 if (UseFilterMode >= IIRLPNORM_FILTER_MODE && UseFilterMode <= TRIGGERED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 309 if (UseFilterMode == PREDEFINED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 310 printf("Enter signal amplitude threshold to start generate predefined signal (default - %d): ", SIGNAL_LOW_THRESHOD);
Arkadi 4:85dbf3e4d432 311 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 312 gets(command);
Arkadi 4:85dbf3e4d432 313 signal_low_threshold = atoi(command);
Arkadi 4:85dbf3e4d432 314 if (signal_low_threshold == 0) {
Arkadi 4:85dbf3e4d432 315 printf("\nWrong input - default is taken\n");
Arkadi 4:85dbf3e4d432 316 signal_low_threshold = SIGNAL_LOW_THRESHOD;
Arkadi 4:85dbf3e4d432 317 }
TauZoolog 3:25cd717ad782 318
Arkadi 4:85dbf3e4d432 319 isSignalClipped = true;
Arkadi 4:85dbf3e4d432 320 while (isSignalClipped) {
Arkadi 4:85dbf3e4d432 321 printf("Enter amplitude scale parameter for predefined signal (default - %5.2f): ", SCALE_FOR_PREDEFINED_OUTPUT);
Arkadi 4:85dbf3e4d432 322 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 323 gets(command);
Arkadi 4:85dbf3e4d432 324 scale_for_predefined_output = atof(command);
Arkadi 4:85dbf3e4d432 325 if (scale_for_predefined_output == float(0.0)) {
Arkadi 4:85dbf3e4d432 326 printf("\nWrong input - default is taken\n");
Arkadi 4:85dbf3e4d432 327 scale_for_predefined_output = SCALE_FOR_PREDEFINED_OUTPUT;
Arkadi 4:85dbf3e4d432 328 }
Arkadi 4:85dbf3e4d432 329 isSignalClipped = false;
Arkadi 4:85dbf3e4d432 330 for (k=0; k < AMOUNT_OF_SIGNIFICANT_SAMPLES; k++ ) {
Arkadi 4:85dbf3e4d432 331 scaled_sounddata[k] = sounddata[k]* scale_for_predefined_output;
Arkadi 4:85dbf3e4d432 332 if (scaled_sounddata[k] < (float)-1.0) {
Arkadi 4:85dbf3e4d432 333 scaled_sounddata[k] = (float)-1.0;
Arkadi 4:85dbf3e4d432 334 isSignalClipped = true;
Arkadi 4:85dbf3e4d432 335 }
Arkadi 4:85dbf3e4d432 336 if (scaled_sounddata[k] > (float)1.0) {
Arkadi 4:85dbf3e4d432 337 scaled_sounddata[k] = (float)1.0;
Arkadi 4:85dbf3e4d432 338 isSignalClipped = true;
Arkadi 4:85dbf3e4d432 339 }
Arkadi 4:85dbf3e4d432 340 }
Arkadi 4:85dbf3e4d432 341 if (isSignalClipped) {
Arkadi 4:85dbf3e4d432 342 printf("With amplitude scale %5.2f, signal will be clipped !!!. Select smaller scale.\n",scale_for_predefined_output);
Arkadi 4:85dbf3e4d432 343 }
Arkadi 4:85dbf3e4d432 344 } // end of while (isSignalClipped)
Arkadi 4:85dbf3e4d432 345 printf("Enter delay after signal in microseconds (default - %d): ", DELAY_AFTER_SIGNAL_TRANSMISSION);
Arkadi 4:85dbf3e4d432 346 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 347 gets(command);
Arkadi 4:85dbf3e4d432 348 delay_after_signal_transmission = atoi(command);
Arkadi 4:85dbf3e4d432 349 if (delay_after_signal_transmission == 0) {
Arkadi 4:85dbf3e4d432 350 printf("\nWrong input - default is taken\n");
Arkadi 4:85dbf3e4d432 351 delay_after_signal_transmission = DELAY_AFTER_SIGNAL_TRANSMISSION;
Arkadi 4:85dbf3e4d432 352 }
Arkadi 4:85dbf3e4d432 353 printf("Enter number of cycles to detect threshold crossing (default - %d): ", NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING);
Arkadi 4:85dbf3e4d432 354 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 355 gets(command);
Arkadi 4:85dbf3e4d432 356 num_of_cycles_to_detect_threshold_crossing = atoi(command);
Arkadi 4:85dbf3e4d432 357 if (num_of_cycles_to_detect_threshold_crossing == 0) {
Arkadi 4:85dbf3e4d432 358 printf("\nWrong input - default is taken\n");
Arkadi 4:85dbf3e4d432 359 num_of_cycles_to_detect_threshold_crossing = NUM_OF_CYCLES_TO_DETECT_THRESHOLD_CROSSING;
Arkadi 4:85dbf3e4d432 360 }
Arkadi 4:85dbf3e4d432 361 printf("Use high pass filter with predefined output: Y/N (default - %s): ",
Arkadi 4:85dbf3e4d432 362 USE_FILTER_WITH_PREDEFINED_OUTPUT ? "Y" : "N" );
Arkadi 4:85dbf3e4d432 363 memset(command, 0, sizeof(command));
Arkadi 4:85dbf3e4d432 364 gets(command);
Arkadi 4:85dbf3e4d432 365 if ((command[0] == 'Y') || (command[0] == 'y')) {
Arkadi 4:85dbf3e4d432 366 use_filter_with_predefined_output = true;
Arkadi 4:85dbf3e4d432 367 } else if ((command[0] == 'N') || (command[0] == 'n')) {
Arkadi 4:85dbf3e4d432 368 use_filter_with_predefined_output = false;
Arkadi 4:85dbf3e4d432 369 } else {
Arkadi 4:85dbf3e4d432 370 use_filter_with_predefined_output = USE_FILTER_WITH_PREDEFINED_OUTPUT;
Arkadi 4:85dbf3e4d432 371 }
TauZoolog 3:25cd717ad782 372
Arkadi 4:85dbf3e4d432 373 if (delay_after_signal_transmission == 0) {
Arkadi 4:85dbf3e4d432 374 delay_after_signal_transmission = USE_FILTER_WITH_PREDEFINED_OUTPUT;
Arkadi 4:85dbf3e4d432 375 }
Arkadi 4:85dbf3e4d432 376 memset(command, 0, sizeof(command));
TauZoolog 3:25cd717ad782 377 }
Arkadi 4:85dbf3e4d432 378 isInputNotValid = 0;
Arkadi 4:85dbf3e4d432 379 } else if (UseFilterMode == TEST_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 380 isInputNotValid = 0;
Arkadi 4:85dbf3e4d432 381 } else if (UseFilterMode == TRIGGERED_OUTPUT_MODE) {
Arkadi 4:85dbf3e4d432 382 printf("Enter signal trigger threshold (default - %d): ", TRIGGER_THRESHOLD_VALUE);
TauZoolog 3:25cd717ad782 383 memset(command, 0, sizeof(command));
TauZoolog 3:25cd717ad782 384 gets(command);
Arkadi 4:85dbf3e4d432 385 triggThresholdValue = atof(command);
Arkadi 4:85dbf3e4d432 386 if (triggThresholdValue == 0) {
Arkadi 4:85dbf3e4d432 387 printf("\nWrong input - default is taken\n");
Arkadi 4:85dbf3e4d432 388 triggThresholdValue = TRIGGER_THRESHOLD_VALUE;
TauZoolog 3:25cd717ad782 389 }
Arkadi 4:85dbf3e4d432 390 } else {
Arkadi 4:85dbf3e4d432 391 printf("\nWrong input - try again\n");
Arkadi 4:85dbf3e4d432 392 }
Arkadi 4:85dbf3e4d432 393 }
Arkadi 4:85dbf3e4d432 394 LoopCount++;
Arkadi 4:85dbf3e4d432 395 print_parameters();
TauZoolog 3:25cd717ad782 396
Arkadi 4:85dbf3e4d432 397 } // end while(True)
Arkadi 4:85dbf3e4d432 398 }