Jared's DAC Code

Dependencies:   mbed

Dependents:   DCS_FINAL_CODE

Fork of Chemical_Sensor_DMA by Jared Baxter

Committer:
baxterja
Date:
Fri Nov 06 03:33:09 2015 +0000
Revision:
4:9fd291254686
Parent:
3:a85b742be262
Child:
5:1b2dc43e8947
This is version 1 of the working filter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
baxterja 3:a85b742be262 1 #include "mbed.h"
baxterja 3:a85b742be262 2 #include "SignalProcessing.h"
baxterja 2:3771b3195c7b 3
baxterja 3:a85b742be262 4 #define pre_compute_length 2000
baxterja 2:3771b3195c7b 5 #define DMA_PERIOD .00001
baxterja 2:3771b3195c7b 6 #define DMA_FREQUENCY 100000
baxterja 2:3771b3195c7b 7 #define CARRIERFREQUENCY 10000
baxterja 3:a85b742be262 8
baxterja 3:a85b742be262 9 uint16_t phase_counter = 0;
baxterja 3:a85b742be262 10
baxterja 2:3771b3195c7b 11 float i_mod_pre[pre_compute_length];
baxterja 2:3771b3195c7b 12 float q_mod_pre[pre_compute_length];
baxterja 4:9fd291254686 13 //uint16_t out_val_pre[pre_compute_length];
baxterja 2:3771b3195c7b 14
baxterja 4:9fd291254686 15 #define twopi 3.14159265359 * 2
baxterja 2:3771b3195c7b 16
baxterja 2:3771b3195c7b 17 void pre_compute_tables() {
baxterja 3:a85b742be262 18
baxterja 2:3771b3195c7b 19 // This function will precompute the cos and sin tables used in the rest of the program
baxterja 2:3771b3195c7b 20 for(int precompute_counter = 0; precompute_counter < pre_compute_length; precompute_counter++){
baxterja 4:9fd291254686 21 //out_val_pre[precompute_counter] = (int) (cos(twopi * CARRIERFREQUENCY * DMA_PERIOD * precompute_counter) * 4965.0 + 49650.0);
baxterja 3:a85b742be262 22 i_mod_pre[precompute_counter] = (cos(twopi * CARRIERFREQUENCY * DMA_PERIOD * precompute_counter));
baxterja 3:a85b742be262 23 q_mod_pre[precompute_counter] = (-sin(twopi * CARRIERFREQUENCY * DMA_PERIOD * precompute_counter));
baxterja 2:3771b3195c7b 24
baxterja 2:3771b3195c7b 25 }
baxterja 3:a85b742be262 26 }
baxterja 3:a85b742be262 27
baxterja 3:a85b742be262 28
baxterja 3:a85b742be262 29
baxterja 4:9fd291254686 30 /*
baxterja 4:9fd291254686 31 #define FIR_33_LENGTH 128
baxterja 4:9fd291254686 32 float FIR33_Sample1_i[FIR_33_LENGTH];
baxterja 4:9fd291254686 33 float FIR33_Sample1_q[FIR_33_LENGTH];
baxterja 4:9fd291254686 34 float FIR33_Sample2_i[FIR_33_LENGTH];
baxterja 4:9fd291254686 35 float FIR33_Sample2_q[FIR_33_LENGTH];
baxterja 4:9fd291254686 36 uint8_t FIR33_Position = 0;
baxterja 4:9fd291254686 37 //Fs = 33, Order = 63, Fpass = 1, Fstop = 5
baxterja 4:9fd291254686 38 static float lp_33_coeff[FIR_33_LENGTH] = {
baxterja 4:9fd291254686 39 0.00112064914891618,
baxterja 4:9fd291254686 40 0.00122265940667415,
baxterja 4:9fd291254686 41 0.00134320266606308,
baxterja 4:9fd291254686 42 0.00148248497505270,
baxterja 4:9fd291254686 43 0.00163752208873233,
baxterja 4:9fd291254686 44 0.00180917436717814,
baxterja 4:9fd291254686 45 0.00199487440500326,
baxterja 4:9fd291254686 46 0.00219591677377202,
baxterja 4:9fd291254686 47 0.00240942435359224,
baxterja 4:9fd291254686 48 0.00263715016478107,
baxterja 4:9fd291254686 49 0.00287620469595143,
baxterja 4:9fd291254686 50 0.00312896642110311,
baxterja 4:9fd291254686 51 0.00339115146671554,
baxterja 4:9fd291254686 52 0.00366703367280862,
baxterja 4:9fd291254686 53 0.00395013103364271,
baxterja 4:9fd291254686 54 0.00424959421024652,
baxterja 4:9fd291254686 55 0.00454749937640992,
baxterja 4:9fd291254686 56 0.00486587065943205,
baxterja 4:9fd291254686 57 0.00519015600428925,
baxterja 4:9fd291254686 58 0.00551644394778870,
baxterja 4:9fd291254686 59 0.00585208754960567,
baxterja 4:9fd291254686 60 0.00619545680874284,
baxterja 4:9fd291254686 61 0.00654599064376495,
baxterja 4:9fd291254686 62 0.00690046871786865,
baxterja 4:9fd291254686 63 0.00725861046415282,
baxterja 4:9fd291254686 64 0.00761931288503866,
baxterja 4:9fd291254686 65 0.00798229719629724,
baxterja 4:9fd291254686 66 0.00834687323478277,
baxterja 4:9fd291254686 67 0.00871239637379653,
baxterja 4:9fd291254686 68 0.00907848882392502,
baxterja 4:9fd291254686 69 0.00944349817409369,
baxterja 4:9fd291254686 70 0.00980681579778287,
baxterja 4:9fd291254686 71 0.0101666025128362,
baxterja 4:9fd291254686 72 0.0105235376400116,
baxterja 4:9fd291254686 73 0.0108740956379341,
baxterja 4:9fd291254686 74 0.0112200337619850,
baxterja 4:9fd291254686 75 0.0115576132398033,
baxterja 4:9fd291254686 76 0.0118892792678013,
baxterja 4:9fd291254686 77 0.0122101053096016,
baxterja 4:9fd291254686 78 0.0125220143316710,
baxterja 4:9fd291254686 79 0.0128250887436567,
baxterja 4:9fd291254686 80 0.0131145746752160,
baxterja 4:9fd291254686 81 0.0133925589239844,
baxterja 4:9fd291254686 82 0.0136577821847874,
baxterja 4:9fd291254686 83 0.0139097056313474,
baxterja 4:9fd291254686 84 0.0141461938484364,
baxterja 4:9fd291254686 85 0.0143672111207676,
baxterja 4:9fd291254686 86 0.0145723586994284,
baxterja 4:9fd291254686 87 0.0147612534972782,
baxterja 4:9fd291254686 88 0.0149330287990815,
baxterja 4:9fd291254686 89 0.0150868196634048,
baxterja 4:9fd291254686 90 0.0152228115376150,
baxterja 4:9fd291254686 91 0.0153400576626228,
baxterja 4:9fd291254686 92 0.0154384553803622,
baxterja 4:9fd291254686 93 0.0155165567546008,
baxterja 4:9fd291254686 94 0.0155766985839343,
baxterja 4:9fd291254686 95 0.0156161625679816,
baxterja 4:9fd291254686 96 0.0156360898266519,
baxterja 4:9fd291254686 97 0.0156360898266519,
baxterja 4:9fd291254686 98 0.0156161625679816,
baxterja 4:9fd291254686 99 0.0155766985839343,
baxterja 4:9fd291254686 100 0.0155165567546008,
baxterja 4:9fd291254686 101 0.0154384553803622,
baxterja 4:9fd291254686 102 0.0153400576626228,
baxterja 4:9fd291254686 103 0.0152228115376150,
baxterja 4:9fd291254686 104 0.0150868196634048,
baxterja 4:9fd291254686 105 0.0149330287990815,
baxterja 4:9fd291254686 106 0.0147612534972782,
baxterja 4:9fd291254686 107 0.0145723586994284,
baxterja 4:9fd291254686 108 0.0143672111207676,
baxterja 4:9fd291254686 109 0.0141461938484364,
baxterja 4:9fd291254686 110 0.0139097056313474,
baxterja 4:9fd291254686 111 0.0136577821847874,
baxterja 4:9fd291254686 112 0.0133925589239844,
baxterja 4:9fd291254686 113 0.0131145746752160,
baxterja 4:9fd291254686 114 0.0128250887436567,
baxterja 4:9fd291254686 115 0.0125220143316710,
baxterja 4:9fd291254686 116 0.0122101053096016,
baxterja 4:9fd291254686 117 0.0118892792678013,
baxterja 4:9fd291254686 118 0.0115576132398033,
baxterja 4:9fd291254686 119 0.0112200337619850,
baxterja 4:9fd291254686 120 0.0108740956379341,
baxterja 4:9fd291254686 121 0.0105235376400116,
baxterja 4:9fd291254686 122 0.0101666025128362,
baxterja 4:9fd291254686 123 0.00980681579778287,
baxterja 4:9fd291254686 124 0.00944349817409369,
baxterja 4:9fd291254686 125 0.00907848882392502,
baxterja 4:9fd291254686 126 0.00871239637379653,
baxterja 4:9fd291254686 127 0.00834687323478277,
baxterja 4:9fd291254686 128 0.00798229719629724,
baxterja 4:9fd291254686 129 0.00761931288503866,
baxterja 4:9fd291254686 130 0.00725861046415282,
baxterja 4:9fd291254686 131 0.00690046871786865,
baxterja 4:9fd291254686 132 0.00654599064376495,
baxterja 4:9fd291254686 133 0.00619545680874284,
baxterja 4:9fd291254686 134 0.00585208754960567,
baxterja 4:9fd291254686 135 0.00551644394778870,
baxterja 4:9fd291254686 136 0.00519015600428925,
baxterja 4:9fd291254686 137 0.00486587065943205,
baxterja 4:9fd291254686 138 0.00454749937640992,
baxterja 4:9fd291254686 139 0.00424959421024652,
baxterja 4:9fd291254686 140 0.00395013103364271,
baxterja 4:9fd291254686 141 0.00366703367280862,
baxterja 4:9fd291254686 142 0.00339115146671554,
baxterja 4:9fd291254686 143 0.00312896642110311,
baxterja 4:9fd291254686 144 0.00287620469595143,
baxterja 4:9fd291254686 145 0.00263715016478107,
baxterja 4:9fd291254686 146 0.00240942435359224,
baxterja 4:9fd291254686 147 0.00219591677377202,
baxterja 4:9fd291254686 148 0.00199487440500326,
baxterja 4:9fd291254686 149 0.00180917436717814,
baxterja 4:9fd291254686 150 0.00163752208873233,
baxterja 4:9fd291254686 151 0.00148248497505270,
baxterja 4:9fd291254686 152 0.00134320266606308,
baxterja 4:9fd291254686 153 0.00122265940667415,
baxterja 4:9fd291254686 154 0.00112064914891618,
baxterja 4:9fd291254686 155 0.00104032814636243,
baxterja 4:9fd291254686 156 0.000982028128151230,
baxterja 4:9fd291254686 157 0.000950473399969370,
baxterja 4:9fd291254686 158 0.000946711675637481,
baxterja 4:9fd291254686 159 0.000976800083269572,
baxterja 4:9fd291254686 160 -0.00572883284452795
baxterja 4:9fd291254686 161 };
baxterja 4:9fd291254686 162 #define NUMSAMPLESAVERAGE 33
baxterja 4:9fd291254686 163 #define DecimationFactor_33 3
baxterja 4:9fd291254686 164
baxterja 4:9fd291254686 165 void filter33(float FIR33_Sample1_i_input, float FIR33_Sample1_q_input, float FIR33_Sample2_i_input, float FIR33_Sample2_q_input)
baxterja 4:9fd291254686 166 {
baxterja 4:9fd291254686 167 //printf("f");
baxterja 4:9fd291254686 168 static uint8_t finalAverageCounter = 0;
baxterja 4:9fd291254686 169 static uint8_t decimationCounter = 0;//used to keep track of how many samples you have currently decimated
baxterja 4:9fd291254686 170 static float FIR33_Sample1_i_DecimatedSum=0;
baxterja 4:9fd291254686 171 static float FIR33_Sample1_q_DecimatedSum=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 4:9fd291254686 172 static float FIR33_Sample2_i_DecimatedSum=0;
baxterja 4:9fd291254686 173 static float FIR33_Sample2_q_DecimatedSum=0;
baxterja 4:9fd291254686 174
baxterja 4:9fd291254686 175 static float Final_Average1_i=0;
baxterja 4:9fd291254686 176 static float Final_Average1_q=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 4:9fd291254686 177 static float Final_Average2_i=0;
baxterja 4:9fd291254686 178 static float Final_Average2_q=0;
baxterja 4:9fd291254686 179
baxterja 4:9fd291254686 180 FIR33_Sample1_i_DecimatedSum += FIR33_Sample1_i_input;//add sample to the sum of previous sample
baxterja 4:9fd291254686 181 FIR33_Sample1_q_DecimatedSum += FIR33_Sample1_q_input;
baxterja 4:9fd291254686 182 FIR33_Sample2_i_DecimatedSum += FIR33_Sample2_i_input;
baxterja 4:9fd291254686 183 FIR33_Sample2_q_DecimatedSum += FIR33_Sample2_q_input;
baxterja 4:9fd291254686 184 decimationCounter++;
baxterja 4:9fd291254686 185 if (decimationCounter >= DecimationFactor_33)//once 10 samples have com
baxterja 4:9fd291254686 186 {
baxterja 4:9fd291254686 187 decimationCounter = 0;//reset decimation counter
baxterja 4:9fd291254686 188 //add sample to 10K filter
baxterja 4:9fd291254686 189 FIR33_Sample1_i[FIR33_Position] = FIR33_Sample1_i_DecimatedSum;
baxterja 4:9fd291254686 190 FIR33_Sample1_q[FIR33_Position] = FIR33_Sample1_q_DecimatedSum;
baxterja 4:9fd291254686 191 FIR33_Sample2_i[FIR33_Position] = FIR33_Sample2_i_DecimatedSum;
baxterja 4:9fd291254686 192 FIR33_Sample2_q[FIR33_Position] = FIR33_Sample2_q_DecimatedSum;
baxterja 4:9fd291254686 193
baxterja 4:9fd291254686 194 FIR33_Sample1_i_DecimatedSum = 0;//reset decimated sum to 0 for next sample
baxterja 4:9fd291254686 195 FIR33_Sample1_q_DecimatedSum = 0;
baxterja 4:9fd291254686 196 FIR33_Sample2_i_DecimatedSum = 0;
baxterja 4:9fd291254686 197 FIR33_Sample2_q_DecimatedSum = 0;
baxterja 4:9fd291254686 198
baxterja 4:9fd291254686 199 FIR33_Position++; //increment circular buffer
baxterja 4:9fd291254686 200 if (FIR33_Position >= FIR_33_LENGTH) //wrap around
baxterja 4:9fd291254686 201 {
baxterja 4:9fd291254686 202 FIR33_Position = 0;
baxterja 4:9fd291254686 203 }
baxterja 4:9fd291254686 204
baxterja 4:9fd291254686 205 // Low pass filter of demodulated signal
baxterja 4:9fd291254686 206 float FIR33_Sample1_i_Output = FIR33_Sample1_i[FIR33_Position] * lp_33_coeff[0];//first multiply of convolution
baxterja 4:9fd291254686 207 float FIR33_Sample1_q_Output = FIR33_Sample1_q[FIR33_Position] * lp_33_coeff[0];
baxterja 4:9fd291254686 208 float FIR33_Sample2_i_Output = FIR33_Sample2_i[FIR33_Position] * lp_33_coeff[0];
baxterja 4:9fd291254686 209 float FIR33_Sample2_q_Output = FIR33_Sample2_q[FIR33_Position] * lp_33_coeff[0];
baxterja 4:9fd291254686 210 int fir_index;
baxterja 4:9fd291254686 211 for(int fir_counter = 1; fir_counter < FIR_33_LENGTH; fir_counter++)//the rest of the convolution
baxterja 4:9fd291254686 212 {
baxterja 4:9fd291254686 213 fir_index = FIR33_Position + fir_counter;
baxterja 4:9fd291254686 214 if (fir_index >= FIR_33_LENGTH)
baxterja 4:9fd291254686 215 {
baxterja 4:9fd291254686 216 fir_index -= FIR_33_LENGTH;
baxterja 4:9fd291254686 217 }
baxterja 4:9fd291254686 218 FIR33_Sample1_i_Output += FIR33_Sample1_i[fir_index] * lp_33_coeff[fir_counter];//convolving
baxterja 4:9fd291254686 219 FIR33_Sample1_q_Output += FIR33_Sample1_q[fir_index] * lp_33_coeff[fir_counter];
baxterja 4:9fd291254686 220 FIR33_Sample2_i_Output += FIR33_Sample2_i[fir_index] * lp_33_coeff[fir_counter];
baxterja 4:9fd291254686 221 FIR33_Sample2_q_Output += FIR33_Sample2_q[fir_index] * lp_33_coeff[fir_counter];
baxterja 4:9fd291254686 222 }
baxterja 4:9fd291254686 223
baxterja 4:9fd291254686 224 //float mag1 = sqrt(FIR33_Sample1_i_Output*FIR33_Sample1_i_Output+FIR33_Sample1_q_Output*FIR33_Sample1_q_Output);
baxterja 4:9fd291254686 225 //float mag2 = sqrt(FIR33_Sample2_i_Output*FIR33_Sample2_i_Output+FIR33_Sample2_q_Output*FIR33_Sample2_q_Output);
baxterja 4:9fd291254686 226 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 4:9fd291254686 227
baxterja 4:9fd291254686 228
baxterja 4:9fd291254686 229 Final_Average1_i+=FIR33_Sample1_i_Output;
baxterja 4:9fd291254686 230 Final_Average1_q+=FIR33_Sample1_q_Output;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 4:9fd291254686 231 Final_Average2_i+=FIR33_Sample2_i_Output;
baxterja 4:9fd291254686 232 Final_Average2_q+=FIR33_Sample2_q_Output;
baxterja 4:9fd291254686 233 finalAverageCounter++;
baxterja 4:9fd291254686 234 if (finalAverageCounter>=NUMSAMPLESAVERAGE)
baxterja 4:9fd291254686 235 {
baxterja 4:9fd291254686 236 finalAverageCounter=0;
baxterja 4:9fd291254686 237 float mag1 = sqrt(Final_Average1_i*Final_Average1_i+Final_Average1_q*Final_Average1_q);
baxterja 4:9fd291254686 238 float mag2 = sqrt(Final_Average2_i*Final_Average2_i+Final_Average2_q*Final_Average2_q);
baxterja 4:9fd291254686 239 printf("V1: %f\tV2: %f\tRatio: %f\n\r",mag1,mag2,mag2/mag1);
baxterja 4:9fd291254686 240 Final_Average1_i=0;
baxterja 4:9fd291254686 241 Final_Average1_q=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 4:9fd291254686 242 Final_Average2_i=0;
baxterja 4:9fd291254686 243 Final_Average2_q=0;
baxterja 4:9fd291254686 244 }
baxterja 4:9fd291254686 245 //float mag1 = sqrt(FIR33_Sample1_i_Output*FIR33_Sample1_i_Output+FIR33_Sample1_q_Output*FIR33_Sample1_q_Output);
baxterja 4:9fd291254686 246 //float mag2 = sqrt(FIR33_Sample2_i_Output*FIR33_Sample2_i_Output+FIR33_Sample2_q_Output*FIR33_Sample2_q_Output);
baxterja 4:9fd291254686 247 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 4:9fd291254686 248 //filter33(FIR33_Sample1_i_Output, FIR33_Sample1_q_Output, FIR33_Sample2_i_Output, FIR33_Sample2_q_Output);
baxterja 4:9fd291254686 249
baxterja 4:9fd291254686 250 }
baxterja 4:9fd291254686 251 }
baxterja 4:9fd291254686 252
baxterja 4:9fd291254686 253 */
baxterja 4:9fd291254686 254
baxterja 4:9fd291254686 255
baxterja 4:9fd291254686 256
baxterja 4:9fd291254686 257
baxterja 3:a85b742be262 258 #define FIR_100_LENGTH 64
baxterja 3:a85b742be262 259 float FIR100_Sample1_i[FIR_100_LENGTH];
baxterja 3:a85b742be262 260 float FIR100_Sample1_q[FIR_100_LENGTH];
baxterja 3:a85b742be262 261 float FIR100_Sample2_i[FIR_100_LENGTH];
baxterja 3:a85b742be262 262 float FIR100_Sample2_q[FIR_100_LENGTH];
baxterja 3:a85b742be262 263 uint8_t FIR100_Position = 0;
baxterja 3:a85b742be262 264 //Fs = 100, Order = 63, Fpass = 1, Fstop = 5
baxterja 3:a85b742be262 265 static float lp_100_coeff[FIR_100_LENGTH] = {
baxterja 4:9fd291254686 266 -0.0127764520494401,
baxterja 4:9fd291254686 267 0.000293288299851251,
baxterja 4:9fd291254686 268 0.000495191328182707,
baxterja 4:9fd291254686 269 0.000838157407497840,
baxterja 4:9fd291254686 270 0.00131525363039988,
baxterja 4:9fd291254686 271 0.00192793120776209,
baxterja 4:9fd291254686 272 0.00267432434442746,
baxterja 4:9fd291254686 273 0.00355353493845821,
baxterja 4:9fd291254686 274 0.00456036887752939,
baxterja 4:9fd291254686 275 0.00569272050003285,
baxterja 4:9fd291254686 276 0.00694090445590618,
baxterja 4:9fd291254686 277 0.00830083540850880,
baxterja 4:9fd291254686 278 0.00975882121858377,
baxterja 4:9fd291254686 279 0.0113079414406056,
baxterja 4:9fd291254686 280 0.0129307225563250,
baxterja 4:9fd291254686 281 0.0146171626466673,
baxterja 4:9fd291254686 282 0.0163450416131430,
baxterja 4:9fd291254686 283 0.0181032221508212,
baxterja 4:9fd291254686 284 0.0198618118533429,
baxterja 4:9fd291254686 285 0.0216165682984801,
baxterja 4:9fd291254686 286 0.0233125759526720,
baxterja 4:9fd291254686 287 0.0249849393161916,
baxterja 4:9fd291254686 288 0.0265739031713570,
baxterja 4:9fd291254686 289 0.0280649931338029,
baxterja 4:9fd291254686 290 0.0294518285092336,
baxterja 4:9fd291254686 291 0.0307008224951110,
baxterja 4:9fd291254686 292 0.0318087914746566,
baxterja 4:9fd291254686 293 0.0327529952249549,
baxterja 4:9fd291254686 294 0.0335263522468559,
baxterja 4:9fd291254686 295 0.0341150932603310,
baxterja 4:9fd291254686 296 0.0345128562450896,
baxterja 4:9fd291254686 297 0.0347130017511486,
baxterja 4:9fd291254686 298 0.0347130017511486,
baxterja 4:9fd291254686 299 0.0345128562450896,
baxterja 4:9fd291254686 300 0.0341150932603310,
baxterja 4:9fd291254686 301 0.0335263522468559,
baxterja 4:9fd291254686 302 0.0327529952249549,
baxterja 4:9fd291254686 303 0.0318087914746566,
baxterja 4:9fd291254686 304 0.0307008224951110,
baxterja 4:9fd291254686 305 0.0294518285092336,
baxterja 4:9fd291254686 306 0.0280649931338029,
baxterja 4:9fd291254686 307 0.0265739031713570,
baxterja 4:9fd291254686 308 0.0249849393161916,
baxterja 4:9fd291254686 309 0.0233125759526720,
baxterja 4:9fd291254686 310 0.0216165682984801,
baxterja 4:9fd291254686 311 0.0198618118533429,
baxterja 4:9fd291254686 312 0.0181032221508212,
baxterja 4:9fd291254686 313 0.0163450416131430,
baxterja 4:9fd291254686 314 0.0146171626466673,
baxterja 4:9fd291254686 315 0.0129307225563250,
baxterja 4:9fd291254686 316 0.0113079414406056,
baxterja 4:9fd291254686 317 0.00975882121858377,
baxterja 4:9fd291254686 318 0.00830083540850880,
baxterja 4:9fd291254686 319 0.00694090445590618,
baxterja 4:9fd291254686 320 0.00569272050003285,
baxterja 4:9fd291254686 321 0.00456036887752939,
baxterja 4:9fd291254686 322 0.00355353493845821,
baxterja 4:9fd291254686 323 0.00267432434442746,
baxterja 4:9fd291254686 324 0.00192793120776209,
baxterja 4:9fd291254686 325 0.00131525363039988,
baxterja 4:9fd291254686 326 0.000838157407497840,
baxterja 4:9fd291254686 327 0.000495191328182707,
baxterja 4:9fd291254686 328 0.000293288299851251,
baxterja 4:9fd291254686 329 -0.0127764520494401
baxterja 3:a85b742be262 330 };
baxterja 3:a85b742be262 331 #define NUMSAMPLESAVERAGE 100
baxterja 3:a85b742be262 332 #define DecimationFactor_10K 10
baxterja 3:a85b742be262 333 void filter100(float FIR100_Sample1_i_input, float FIR100_Sample1_q_input, float FIR100_Sample2_i_input, float FIR100_Sample2_q_input)
baxterja 3:a85b742be262 334 {
baxterja 4:9fd291254686 335 //printf("f");
baxterja 3:a85b742be262 336 static uint8_t finalAverageCounter = 0;
baxterja 3:a85b742be262 337 static uint8_t decimationCounter = 0;//used to keep track of how many samples you have currently decimated
baxterja 3:a85b742be262 338 static float FIR100_Sample1_i_DecimatedSum=0;
baxterja 3:a85b742be262 339 static float FIR100_Sample1_q_DecimatedSum=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 340 static float FIR100_Sample2_i_DecimatedSum=0;
baxterja 3:a85b742be262 341 static float FIR100_Sample2_q_DecimatedSum=0;
baxterja 3:a85b742be262 342
baxterja 3:a85b742be262 343 static float Final_Average1_i=0;
baxterja 3:a85b742be262 344 static float Final_Average1_q=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 345 static float Final_Average2_i=0;
baxterja 3:a85b742be262 346 static float Final_Average2_q=0;
baxterja 3:a85b742be262 347
baxterja 3:a85b742be262 348 FIR100_Sample1_i_DecimatedSum += FIR100_Sample1_i_input;//add sample to the sum of previous sample
baxterja 3:a85b742be262 349 FIR100_Sample1_q_DecimatedSum += FIR100_Sample1_q_input;
baxterja 3:a85b742be262 350 FIR100_Sample2_i_DecimatedSum += FIR100_Sample2_i_input;
baxterja 3:a85b742be262 351 FIR100_Sample2_q_DecimatedSum += FIR100_Sample2_q_input;
baxterja 3:a85b742be262 352 decimationCounter++;
baxterja 3:a85b742be262 353 if (decimationCounter >= DecimationFactor_10K)//once 10 samples have com
baxterja 3:a85b742be262 354 {
baxterja 3:a85b742be262 355 decimationCounter = 0;//reset decimation counter
baxterja 3:a85b742be262 356 //add sample to 10K filter
baxterja 3:a85b742be262 357 FIR100_Sample1_i[FIR100_Position] = FIR100_Sample1_i_DecimatedSum;
baxterja 3:a85b742be262 358 FIR100_Sample1_q[FIR100_Position] = FIR100_Sample1_q_DecimatedSum;
baxterja 3:a85b742be262 359 FIR100_Sample2_i[FIR100_Position] = FIR100_Sample2_i_DecimatedSum;
baxterja 3:a85b742be262 360 FIR100_Sample2_q[FIR100_Position] = FIR100_Sample2_q_DecimatedSum;
baxterja 3:a85b742be262 361
baxterja 3:a85b742be262 362 FIR100_Sample1_i_DecimatedSum = 0;//reset decimated sum to 0 for next sample
baxterja 3:a85b742be262 363 FIR100_Sample1_q_DecimatedSum = 0;
baxterja 3:a85b742be262 364 FIR100_Sample2_i_DecimatedSum = 0;
baxterja 3:a85b742be262 365 FIR100_Sample2_q_DecimatedSum = 0;
baxterja 3:a85b742be262 366
baxterja 3:a85b742be262 367 FIR100_Position++; //increment circular buffer
baxterja 3:a85b742be262 368 if (FIR100_Position >= FIR_100_LENGTH) //wrap around
baxterja 3:a85b742be262 369 {
baxterja 3:a85b742be262 370 FIR100_Position = 0;
baxterja 3:a85b742be262 371 }
baxterja 3:a85b742be262 372
baxterja 3:a85b742be262 373 // Low pass filter of demodulated signal
baxterja 3:a85b742be262 374 float FIR100_Sample1_i_Output = FIR100_Sample1_i[FIR100_Position] * lp_100_coeff[0];//first multiply of convolution
baxterja 3:a85b742be262 375 float FIR100_Sample1_q_Output = FIR100_Sample1_q[FIR100_Position] * lp_100_coeff[0];
baxterja 3:a85b742be262 376 float FIR100_Sample2_i_Output = FIR100_Sample2_i[FIR100_Position] * lp_100_coeff[0];
baxterja 3:a85b742be262 377 float FIR100_Sample2_q_Output = FIR100_Sample2_q[FIR100_Position] * lp_100_coeff[0];
baxterja 3:a85b742be262 378 int fir_index;
baxterja 3:a85b742be262 379 for(int fir_counter = 1; fir_counter < FIR_100_LENGTH; fir_counter++)//the rest of the convolution
baxterja 3:a85b742be262 380 {
baxterja 3:a85b742be262 381 fir_index = FIR100_Position + fir_counter;
baxterja 3:a85b742be262 382 if (fir_index >= FIR_100_LENGTH)
baxterja 3:a85b742be262 383 {
baxterja 3:a85b742be262 384 fir_index -= FIR_100_LENGTH;
baxterja 3:a85b742be262 385 }
baxterja 3:a85b742be262 386 FIR100_Sample1_i_Output += FIR100_Sample1_i[fir_index] * lp_100_coeff[fir_counter];//convolving
baxterja 3:a85b742be262 387 FIR100_Sample1_q_Output += FIR100_Sample1_q[fir_index] * lp_100_coeff[fir_counter];
baxterja 3:a85b742be262 388 FIR100_Sample2_i_Output += FIR100_Sample2_i[fir_index] * lp_100_coeff[fir_counter];
baxterja 3:a85b742be262 389 FIR100_Sample2_q_Output += FIR100_Sample2_q[fir_index] * lp_100_coeff[fir_counter];
baxterja 3:a85b742be262 390 }
baxterja 3:a85b742be262 391
baxterja 3:a85b742be262 392 //float mag1 = sqrt(FIR100_Sample1_i_Output*FIR100_Sample1_i_Output+FIR100_Sample1_q_Output*FIR100_Sample1_q_Output);
baxterja 3:a85b742be262 393 //float mag2 = sqrt(FIR100_Sample2_i_Output*FIR100_Sample2_i_Output+FIR100_Sample2_q_Output*FIR100_Sample2_q_Output);
baxterja 3:a85b742be262 394 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 3:a85b742be262 395
baxterja 3:a85b742be262 396
baxterja 3:a85b742be262 397 Final_Average1_i+=FIR100_Sample1_i_Output;
baxterja 3:a85b742be262 398 Final_Average1_q+=FIR100_Sample1_q_Output;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 399 Final_Average2_i+=FIR100_Sample2_i_Output;
baxterja 3:a85b742be262 400 Final_Average2_q+=FIR100_Sample2_q_Output;
baxterja 3:a85b742be262 401 finalAverageCounter++;
baxterja 3:a85b742be262 402 if (finalAverageCounter>=NUMSAMPLESAVERAGE)
baxterja 3:a85b742be262 403 {
baxterja 3:a85b742be262 404 finalAverageCounter=0;
baxterja 3:a85b742be262 405 float mag1 = sqrt(Final_Average1_i*Final_Average1_i+Final_Average1_q*Final_Average1_q);
baxterja 3:a85b742be262 406 float mag2 = sqrt(Final_Average2_i*Final_Average2_i+Final_Average2_q*Final_Average2_q);
baxterja 4:9fd291254686 407 printf("V1: %f\tV2: %f\tRatio: %f\n\r",mag1,mag2,mag2/mag1);
baxterja 3:a85b742be262 408 Final_Average1_i=0;
baxterja 3:a85b742be262 409 Final_Average1_q=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 410 Final_Average2_i=0;
baxterja 3:a85b742be262 411 Final_Average2_q=0;
baxterja 3:a85b742be262 412 }
baxterja 4:9fd291254686 413
baxterja 3:a85b742be262 414 //float mag1 = sqrt(FIR100_Sample1_i_Output*FIR100_Sample1_i_Output+FIR100_Sample1_q_Output*FIR100_Sample1_q_Output);
baxterja 3:a85b742be262 415 //float mag2 = sqrt(FIR100_Sample2_i_Output*FIR100_Sample2_i_Output+FIR100_Sample2_q_Output*FIR100_Sample2_q_Output);
baxterja 3:a85b742be262 416 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 4:9fd291254686 417 //filter33(FIR100_Sample1_i_Output, FIR100_Sample1_q_Output, FIR100_Sample2_i_Output, FIR100_Sample2_q_Output);
baxterja 3:a85b742be262 418
baxterja 3:a85b742be262 419 }
baxterja 3:a85b742be262 420 }
baxterja 3:a85b742be262 421
baxterja 3:a85b742be262 422
baxterja 3:a85b742be262 423
baxterja 3:a85b742be262 424
baxterja 3:a85b742be262 425
baxterja 3:a85b742be262 426
baxterja 3:a85b742be262 427 #define FIR_1K_LENGTH 32
baxterja 3:a85b742be262 428 float FIR1K_Sample1_i[FIR_1K_LENGTH];
baxterja 3:a85b742be262 429 float FIR1K_Sample1_q[FIR_1K_LENGTH];
baxterja 3:a85b742be262 430 float FIR1K_Sample2_i[FIR_1K_LENGTH];
baxterja 3:a85b742be262 431 float FIR1K_Sample2_q[FIR_1K_LENGTH];
baxterja 3:a85b742be262 432 uint8_t FIR1K_Position = 0;
baxterja 3:a85b742be262 433 //Fs = 1000, Order = 31, Fpass = 1, Fstop = 50
baxterja 3:a85b742be262 434 static float lp_1K_coeff[FIR_1K_LENGTH] = {
baxterja 3:a85b742be262 435 0.0108990071119901,
baxterja 3:a85b742be262 436 0.00826963267129267,
baxterja 3:a85b742be262 437 0.0110961530344968,
baxterja 3:a85b742be262 438 0.0143019800886844,
baxterja 3:a85b742be262 439 0.0178397268153335,
baxterja 3:a85b742be262 440 0.0216326995075556,
baxterja 3:a85b742be262 441 0.0255928087296069,
baxterja 3:a85b742be262 442 0.0296287914936736,
baxterja 3:a85b742be262 443 0.0336287768230528,
baxterja 3:a85b742be262 444 0.0374693714591658,
baxterja 3:a85b742be262 445 0.0410324028349472,
baxterja 3:a85b742be262 446 0.0442148191339877,
baxterja 3:a85b742be262 447 0.0468906440777966,
baxterja 3:a85b742be262 448 0.0489881978583567,
baxterja 3:a85b742be262 449 0.0504243479483288,
baxterja 3:a85b742be262 450 0.0511581882807637,
baxterja 3:a85b742be262 451 0.0511581882807637,
baxterja 3:a85b742be262 452 0.0504243479483288,
baxterja 3:a85b742be262 453 0.0489881978583567,
baxterja 3:a85b742be262 454 0.0468906440777966,
baxterja 3:a85b742be262 455 0.0442148191339877,
baxterja 3:a85b742be262 456 0.0410324028349472,
baxterja 3:a85b742be262 457 0.0374693714591658,
baxterja 3:a85b742be262 458 0.0336287768230528,
baxterja 3:a85b742be262 459 0.0296287914936736,
baxterja 3:a85b742be262 460 0.0255928087296069,
baxterja 3:a85b742be262 461 0.0216326995075556,
baxterja 3:a85b742be262 462 0.0178397268153335,
baxterja 3:a85b742be262 463 0.0143019800886844,
baxterja 3:a85b742be262 464 0.0110961530344968,
baxterja 3:a85b742be262 465 0.00826963267129267,
baxterja 3:a85b742be262 466 0.0108990071119901
baxterja 3:a85b742be262 467 };
baxterja 3:a85b742be262 468
baxterja 3:a85b742be262 469 #define DecimationFactor_10K 10
baxterja 3:a85b742be262 470 void filter1K(float FIR1K_Sample1_i_input, float FIR1K_Sample1_q_input, float FIR1K_Sample2_i_input, float FIR1K_Sample2_q_input)
baxterja 3:a85b742be262 471 {
baxterja 3:a85b742be262 472 static uint8_t decimationCounter = 0;//used to keep track of how many samples you have currently decimated
baxterja 3:a85b742be262 473 static float FIR1K_Sample1_i_DecimatedSum=0;
baxterja 3:a85b742be262 474 static float FIR1K_Sample1_q_DecimatedSum=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 475 static float FIR1K_Sample2_i_DecimatedSum=0;
baxterja 3:a85b742be262 476 static float FIR1K_Sample2_q_DecimatedSum=0;
baxterja 3:a85b742be262 477
baxterja 3:a85b742be262 478 FIR1K_Sample1_i_DecimatedSum += FIR1K_Sample1_i_input;//add sample to the sum of previous sample
baxterja 3:a85b742be262 479 FIR1K_Sample1_q_DecimatedSum += FIR1K_Sample1_q_input;
baxterja 3:a85b742be262 480 FIR1K_Sample2_i_DecimatedSum += FIR1K_Sample2_i_input;
baxterja 3:a85b742be262 481 FIR1K_Sample2_q_DecimatedSum += FIR1K_Sample2_q_input;
baxterja 3:a85b742be262 482 decimationCounter++;
baxterja 3:a85b742be262 483 if (decimationCounter >= DecimationFactor_10K)//once 10 samples have com
baxterja 3:a85b742be262 484 {
baxterja 3:a85b742be262 485 decimationCounter = 0;//reset decimation counter
baxterja 3:a85b742be262 486 //add sample to 10K filter
baxterja 3:a85b742be262 487 FIR1K_Sample1_i[FIR1K_Position] = FIR1K_Sample1_i_DecimatedSum;
baxterja 3:a85b742be262 488 FIR1K_Sample1_q[FIR1K_Position] = FIR1K_Sample1_q_DecimatedSum;
baxterja 3:a85b742be262 489 FIR1K_Sample2_i[FIR1K_Position] = FIR1K_Sample2_i_DecimatedSum;
baxterja 3:a85b742be262 490 FIR1K_Sample2_q[FIR1K_Position] = FIR1K_Sample2_q_DecimatedSum;
baxterja 3:a85b742be262 491
baxterja 3:a85b742be262 492 FIR1K_Sample1_i_DecimatedSum = 0;//reset decimated sum to 0 for next sample
baxterja 3:a85b742be262 493 FIR1K_Sample1_q_DecimatedSum = 0;
baxterja 3:a85b742be262 494 FIR1K_Sample2_i_DecimatedSum = 0;
baxterja 3:a85b742be262 495 FIR1K_Sample2_q_DecimatedSum = 0;
baxterja 3:a85b742be262 496
baxterja 3:a85b742be262 497 FIR1K_Position++; //increment circular buffer
baxterja 3:a85b742be262 498 if (FIR1K_Position >= FIR_1K_LENGTH) //wrap around
baxterja 3:a85b742be262 499 {
baxterja 3:a85b742be262 500 FIR1K_Position = 0;
baxterja 3:a85b742be262 501 }
baxterja 3:a85b742be262 502
baxterja 3:a85b742be262 503 // Low pass filter of demodulated signal
baxterja 3:a85b742be262 504 float FIR1K_Sample1_i_Output = FIR1K_Sample1_i[FIR1K_Position] * lp_1K_coeff[0];//first multiply of convolution
baxterja 3:a85b742be262 505 float FIR1K_Sample1_q_Output = FIR1K_Sample1_q[FIR1K_Position] * lp_1K_coeff[0];
baxterja 3:a85b742be262 506 float FIR1K_Sample2_i_Output = FIR1K_Sample2_i[FIR1K_Position] * lp_1K_coeff[0];
baxterja 3:a85b742be262 507 float FIR1K_Sample2_q_Output = FIR1K_Sample2_q[FIR1K_Position] * lp_1K_coeff[0];
baxterja 3:a85b742be262 508 int fir_index;
baxterja 3:a85b742be262 509 for(int fir_counter = 1; fir_counter < FIR_1K_LENGTH; fir_counter++)//the rest of the convolution
baxterja 3:a85b742be262 510 {
baxterja 3:a85b742be262 511 fir_index = FIR1K_Position + fir_counter;
baxterja 3:a85b742be262 512 if (fir_index >= FIR_1K_LENGTH)
baxterja 3:a85b742be262 513 {
baxterja 3:a85b742be262 514 fir_index -= FIR_1K_LENGTH;
baxterja 3:a85b742be262 515 }
baxterja 3:a85b742be262 516 FIR1K_Sample1_i_Output += FIR1K_Sample1_i[fir_index] * lp_1K_coeff[fir_counter];//convolving
baxterja 3:a85b742be262 517 FIR1K_Sample1_q_Output += FIR1K_Sample1_q[fir_index] * lp_1K_coeff[fir_counter];
baxterja 3:a85b742be262 518 FIR1K_Sample2_i_Output += FIR1K_Sample2_i[fir_index] * lp_1K_coeff[fir_counter];
baxterja 3:a85b742be262 519 FIR1K_Sample2_q_Output += FIR1K_Sample2_q[fir_index] * lp_1K_coeff[fir_counter];
baxterja 3:a85b742be262 520 }
baxterja 3:a85b742be262 521 //float mag1 = sqrt(FIR1K_Sample1_i_Output*FIR1K_Sample1_i_Output+FIR1K_Sample1_q_Output*FIR1K_Sample1_q_Output);
baxterja 3:a85b742be262 522 //float mag2 = sqrt(FIR1K_Sample2_i_Output*FIR1K_Sample2_i_Output+FIR1K_Sample2_q_Output*FIR1K_Sample2_q_Output);
baxterja 3:a85b742be262 523 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 3:a85b742be262 524 filter100(FIR1K_Sample1_i_Output, FIR1K_Sample1_q_Output, FIR1K_Sample2_i_Output, FIR1K_Sample2_q_Output);
baxterja 3:a85b742be262 525 }
baxterja 3:a85b742be262 526 }
baxterja 3:a85b742be262 527
baxterja 3:a85b742be262 528
baxterja 3:a85b742be262 529
baxterja 3:a85b742be262 530 #define FIR_10K_LENGTH 16
baxterja 3:a85b742be262 531 float FIR10K_Sample1_i[FIR_10K_LENGTH];
baxterja 3:a85b742be262 532 float FIR10K_Sample1_q[FIR_10K_LENGTH];
baxterja 3:a85b742be262 533 float FIR10K_Sample2_i[FIR_10K_LENGTH];
baxterja 3:a85b742be262 534 float FIR10K_Sample2_q[FIR_10K_LENGTH];
baxterja 3:a85b742be262 535 uint8_t FIR10K_Position = 0;
baxterja 3:a85b742be262 536 //Fs = 10000, Order = 15, Fpass = 10, Fstop = 900
baxterja 3:a85b742be262 537 static float lp_10K_coeff[FIR_10K_LENGTH] = {
baxterja 3:a85b742be262 538 0.0242947345184044,
baxterja 3:a85b742be262 539 0.0283599756767857,
baxterja 3:a85b742be262 540 0.0416004471421328,
baxterja 3:a85b742be262 541 0.0557840684332377,
baxterja 3:a85b742be262 542 0.0695867614174704,
baxterja 3:a85b742be262 543 0.0816182734401924,
baxterja 3:a85b742be262 544 0.0904748943926879,
baxterja 3:a85b742be262 545 0.0951919735506062,
baxterja 3:a85b742be262 546 0.0951919735506062,
baxterja 3:a85b742be262 547 0.0904748943926879,
baxterja 3:a85b742be262 548 0.0816182734401924,
baxterja 3:a85b742be262 549 0.0695867614174704,
baxterja 3:a85b742be262 550 0.0557840684332377,
baxterja 3:a85b742be262 551 0.0416004471421328,
baxterja 3:a85b742be262 552 0.0283599756767857,
baxterja 3:a85b742be262 553 0.0242947345184044
baxterja 3:a85b742be262 554 };
baxterja 3:a85b742be262 555
baxterja 3:a85b742be262 556 #define DecimationFactor_100K 10
baxterja 3:a85b742be262 557 void filter10K(float FIR10K_Sample1_i_input, float FIR10K_Sample1_q_input, float FIR10K_Sample2_i_input, float FIR10K_Sample2_q_input)
baxterja 3:a85b742be262 558 {
baxterja 3:a85b742be262 559 static uint8_t decimationCounter = 0;//used to keep track of how many samples you have currently decimated
baxterja 3:a85b742be262 560 static float FIR10K_Sample1_i_DecimatedSum=0;
baxterja 3:a85b742be262 561 static float FIR10K_Sample1_q_DecimatedSum=0;//when decimating sum up all 10 samples at a time have that be your output value
baxterja 3:a85b742be262 562 static float FIR10K_Sample2_i_DecimatedSum=0;
baxterja 3:a85b742be262 563 static float FIR10K_Sample2_q_DecimatedSum=0;
baxterja 3:a85b742be262 564
baxterja 3:a85b742be262 565 FIR10K_Sample1_i_DecimatedSum += FIR10K_Sample1_i_input;//add sample to the sum of previous sample
baxterja 3:a85b742be262 566 FIR10K_Sample1_q_DecimatedSum += FIR10K_Sample1_q_input;
baxterja 3:a85b742be262 567 FIR10K_Sample2_i_DecimatedSum += FIR10K_Sample2_i_input;
baxterja 3:a85b742be262 568 FIR10K_Sample2_q_DecimatedSum += FIR10K_Sample2_q_input;
baxterja 3:a85b742be262 569 decimationCounter++;
baxterja 3:a85b742be262 570 if (decimationCounter >= DecimationFactor_100K)//once 10 samples have com
baxterja 3:a85b742be262 571 {
baxterja 3:a85b742be262 572 decimationCounter = 0;//reset decimation counter
baxterja 3:a85b742be262 573 //add sample to 10K filter
baxterja 3:a85b742be262 574 FIR10K_Sample1_i[FIR10K_Position] = FIR10K_Sample1_i_DecimatedSum;
baxterja 3:a85b742be262 575 FIR10K_Sample1_q[FIR10K_Position] = FIR10K_Sample1_q_DecimatedSum;
baxterja 3:a85b742be262 576 FIR10K_Sample2_i[FIR10K_Position] = FIR10K_Sample2_i_DecimatedSum;
baxterja 3:a85b742be262 577 FIR10K_Sample2_q[FIR10K_Position] = FIR10K_Sample2_q_DecimatedSum;
baxterja 3:a85b742be262 578
baxterja 3:a85b742be262 579 FIR10K_Sample1_i_DecimatedSum = 0;//reset decimated sum to 0 for next sample
baxterja 3:a85b742be262 580 FIR10K_Sample1_q_DecimatedSum = 0;
baxterja 3:a85b742be262 581 FIR10K_Sample2_i_DecimatedSum = 0;
baxterja 3:a85b742be262 582 FIR10K_Sample2_q_DecimatedSum = 0;
baxterja 3:a85b742be262 583
baxterja 3:a85b742be262 584 FIR10K_Position++; //increment circular buffer
baxterja 3:a85b742be262 585 if (FIR10K_Position >= FIR_10K_LENGTH) //wrap around
baxterja 3:a85b742be262 586 {
baxterja 3:a85b742be262 587 FIR10K_Position = 0;
baxterja 3:a85b742be262 588 }
baxterja 3:a85b742be262 589
baxterja 3:a85b742be262 590 // Low pass filter of demodulated signal
baxterja 3:a85b742be262 591 float FIR10K_Sample1_i_Output = FIR10K_Sample1_i[FIR10K_Position] * lp_10K_coeff[0];//first multiply of convolution
baxterja 3:a85b742be262 592 float FIR10K_Sample1_q_Output = FIR10K_Sample1_q[FIR10K_Position] * lp_10K_coeff[0];
baxterja 3:a85b742be262 593 float FIR10K_Sample2_i_Output = FIR10K_Sample2_i[FIR10K_Position] * lp_10K_coeff[0];
baxterja 3:a85b742be262 594 float FIR10K_Sample2_q_Output = FIR10K_Sample2_q[FIR10K_Position] * lp_10K_coeff[0];
baxterja 3:a85b742be262 595 int fir_index;
baxterja 3:a85b742be262 596 for(int fir_counter = 1; fir_counter < FIR_10K_LENGTH; fir_counter++)//the rest of the convolution
baxterja 3:a85b742be262 597 {
baxterja 3:a85b742be262 598 fir_index = FIR10K_Position + fir_counter;
baxterja 3:a85b742be262 599 if (fir_index >= FIR_10K_LENGTH)
baxterja 3:a85b742be262 600 {
baxterja 3:a85b742be262 601 fir_index -= FIR_10K_LENGTH;
baxterja 3:a85b742be262 602 }
baxterja 3:a85b742be262 603 FIR10K_Sample1_i_Output += FIR10K_Sample1_i[fir_index] * lp_10K_coeff[fir_counter];//convolving
baxterja 3:a85b742be262 604 FIR10K_Sample1_q_Output += FIR10K_Sample1_q[fir_index] * lp_10K_coeff[fir_counter];
baxterja 3:a85b742be262 605 FIR10K_Sample2_i_Output += FIR10K_Sample2_i[fir_index] * lp_10K_coeff[fir_counter];
baxterja 3:a85b742be262 606 FIR10K_Sample2_q_Output += FIR10K_Sample2_q[fir_index] * lp_10K_coeff[fir_counter];
baxterja 3:a85b742be262 607 }
baxterja 3:a85b742be262 608 //float mag1 = sqrt(FIR10K_Sample1_i_Output*FIR10K_Sample1_i_Output+FIR10K_Sample1_q_Output*FIR10K_Sample1_q_Output);
baxterja 3:a85b742be262 609 //float mag2 = sqrt(FIR10K_Sample2_i_Output*FIR10K_Sample2_i_Output+FIR10K_Sample2_q_Output*FIR10K_Sample2_q_Output);
baxterja 3:a85b742be262 610 //printf("P1: %d\tV1: %f\tV2: %f\n\r",phase_counter,mag1,mag2);
baxterja 3:a85b742be262 611 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 3:a85b742be262 612 filter1K(FIR10K_Sample1_i_Output, FIR10K_Sample1_q_Output, FIR10K_Sample2_i_Output, FIR10K_Sample2_q_Output);
baxterja 3:a85b742be262 613 }
baxterja 3:a85b742be262 614 }
baxterja 3:a85b742be262 615
baxterja 3:a85b742be262 616
baxterja 3:a85b742be262 617
baxterja 3:a85b742be262 618
baxterja 3:a85b742be262 619
baxterja 3:a85b742be262 620 #define FIR_100K_LENGTH 16
baxterja 3:a85b742be262 621 float FIR100K_Sample1_i[FIR_100K_LENGTH];
baxterja 3:a85b742be262 622 float FIR100K_Sample1_q[FIR_100K_LENGTH];
baxterja 3:a85b742be262 623 float FIR100K_Sample2_i[FIR_100K_LENGTH];
baxterja 3:a85b742be262 624 float FIR100K_Sample2_q[FIR_100K_LENGTH];
baxterja 3:a85b742be262 625
baxterja 3:a85b742be262 626 uint8_t FIR100K_Position = 0;
baxterja 3:a85b742be262 627 //Fs = 100000, Order = 15, Fpass = 100, Fstop = 9000
baxterja 3:a85b742be262 628 static float lp_100K_coeff[FIR_100K_LENGTH] = {
baxterja 4:9fd291254686 629 0.0102922869776514,
baxterja 4:9fd291254686 630 0.0196357484226367,
baxterja 4:9fd291254686 631 0.0346068275004222,
baxterja 4:9fd291254686 632 0.0528964828542786,
baxterja 4:9fd291254686 633 0.0725363140207878,
baxterja 4:9fd291254686 634 0.0908817555678698,
baxterja 4:9fd291254686 635 0.105122693390187,
baxterja 4:9fd291254686 636 0.112904816559370,
baxterja 4:9fd291254686 637 0.112904816559370,
baxterja 4:9fd291254686 638 0.105122693390187,
baxterja 4:9fd291254686 639 0.0908817555678698,
baxterja 4:9fd291254686 640 0.0725363140207878,
baxterja 4:9fd291254686 641 0.0528964828542786,
baxterja 4:9fd291254686 642 0.0346068275004222,
baxterja 4:9fd291254686 643 0.0196357484226367,
baxterja 4:9fd291254686 644 0.0102922869776514
baxterja 3:a85b742be262 645 };
baxterja 3:a85b742be262 646
baxterja 3:a85b742be262 647 void filter100K(int sample1, int sample2)
baxterja 3:a85b742be262 648 {
baxterja 3:a85b742be262 649 float current_i_mod = i_mod_pre[phase_counter];//sin and cos to demodulate signature
baxterja 3:a85b742be262 650 float current_q_mod = q_mod_pre[phase_counter];
baxterja 3:a85b742be262 651 phase_counter++;//increment the demodulating sinusoids by 1/Fs
baxterja 3:a85b742be262 652
baxterja 3:a85b742be262 653 if (phase_counter>=pre_compute_length)//wrap around to beginning of sin wave
baxterja 3:a85b742be262 654 {
baxterja 3:a85b742be262 655 phase_counter = 0;
baxterja 3:a85b742be262 656 }
baxterja 3:a85b742be262 657
baxterja 3:a85b742be262 658 FIR100K_Sample1_i[FIR100K_Position] = (sample1 * current_i_mod);//this centers the delta function at f =0 in z space
baxterja 3:a85b742be262 659 FIR100K_Sample1_q[FIR100K_Position] = (sample1 * current_q_mod);//this centers the delta function at f =0 in z space
baxterja 3:a85b742be262 660 FIR100K_Sample2_i[FIR100K_Position] = (sample2 * current_i_mod);//this centers the delta function at f =0 in z space
baxterja 3:a85b742be262 661 FIR100K_Sample2_q[FIR100K_Position] = (sample2 * current_q_mod);//this centers the delta function at f =0 in z space
baxterja 3:a85b742be262 662
baxterja 3:a85b742be262 663 FIR100K_Position++;//increment position of circular buffer
baxterja 3:a85b742be262 664 if (FIR100K_Position >= FIR_100K_LENGTH)//wrap around at end of buffer
baxterja 3:a85b742be262 665 {
baxterja 3:a85b742be262 666 FIR100K_Position = 0;
baxterja 3:a85b742be262 667 }
baxterja 3:a85b742be262 668
baxterja 3:a85b742be262 669 // Low pass filter of demodulated signal
baxterja 3:a85b742be262 670 float FIR100K_Sample1_i_Output = FIR100K_Sample1_i[FIR100K_Position] * lp_100K_coeff[0];//first multiply in convolution
baxterja 3:a85b742be262 671 float FIR100K_Sample1_q_Output = FIR100K_Sample1_q[FIR100K_Position] * lp_100K_coeff[0];//first multiply in convolution
baxterja 3:a85b742be262 672 float FIR100K_Sample2_i_Output = FIR100K_Sample2_i[FIR100K_Position] * lp_100K_coeff[0];//first multiply in convolution
baxterja 3:a85b742be262 673 float FIR100K_Sample2_q_Output = FIR100K_Sample2_q[FIR100K_Position] * lp_100K_coeff[0];//first multiply in convolution
baxterja 3:a85b742be262 674 int fir_index;
baxterja 3:a85b742be262 675 for(int fir_counter = 1; fir_counter < FIR_100K_LENGTH; fir_counter++)//convolves the filter with the signal
baxterja 3:a85b742be262 676 {
baxterja 3:a85b742be262 677 fir_index = FIR100K_Position + fir_counter;
baxterja 3:a85b742be262 678 if (fir_index >= FIR_100K_LENGTH)//wrap around
baxterja 3:a85b742be262 679 {
baxterja 3:a85b742be262 680 fir_index -= FIR_100K_LENGTH;
baxterja 3:a85b742be262 681 }
baxterja 3:a85b742be262 682 FIR100K_Sample1_i_Output += FIR100K_Sample1_i[fir_index] * lp_100K_coeff[fir_counter];//convolution
baxterja 3:a85b742be262 683 FIR100K_Sample1_q_Output += FIR100K_Sample1_q[fir_index] * lp_100K_coeff[fir_counter];
baxterja 3:a85b742be262 684 FIR100K_Sample2_i_Output += FIR100K_Sample2_i[fir_index] * lp_100K_coeff[fir_counter];
baxterja 3:a85b742be262 685 FIR100K_Sample2_q_Output += FIR100K_Sample2_q[fir_index] * lp_100K_coeff[fir_counter];
baxterja 3:a85b742be262 686 }
baxterja 3:a85b742be262 687 //pass data to next filter
baxterja 3:a85b742be262 688 //float mag1 = sqrt(FIR100K_Sample1_i_Output*FIR100K_Sample1_i_Output+FIR100K_Sample1_q_Output*FIR100K_Sample1_q_Output);
baxterja 3:a85b742be262 689 //float mag2 = sqrt(FIR100K_Sample2_i_Output*FIR100K_Sample2_i_Output+FIR100K_Sample2_q_Output*FIR100K_Sample2_q_Output);
baxterja 3:a85b742be262 690 //printf("V1: %f\tV2: %f\n\r",mag1,mag2);
baxterja 3:a85b742be262 691 filter10K(FIR100K_Sample1_i_Output, FIR100K_Sample1_q_Output, FIR100K_Sample2_i_Output, FIR100K_Sample2_q_Output);
baxterja 3:a85b742be262 692 }
baxterja 3:a85b742be262 693
baxterja 3:a85b742be262 694
baxterja 3:a85b742be262 695