Jared's DAC Code

Dependencies:   mbed

Dependents:   DCS_FINAL_CODE

Fork of Chemical_Sensor_DMA by Jared Baxter

Committer:
DeWayneDennis
Date:
Sat Dec 19 21:47:52 2015 +0000
Revision:
7:af255a90505e
Parent:
6:63de50ac29be
Final Code

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