Dependencies:   mbed-dsp mbed

Fork of DSP_200kHz by Mazzeo Research Group

Committer:
baxterja
Date:
Wed Aug 30 02:29:53 2017 +0000
Revision:
82:f6fbbb8a2139
Parent:
81:30d699e951a8
Child:
83:0d068da1c6b7
probably 190hz and 10kHz, however I don't have a way to confirm right now.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
baxterja 75:8bb94685c80b 1 #include "demodulate.h"
baxterja 75:8bb94685c80b 2
baxterja 78:10b2916b8f5c 3 #define MAX_NUMBER_DEMOD_FREQ 2
baxterja 75:8bb94685c80b 4
baxterja 82:f6fbbb8a2139 5
baxterja 81:30d699e951a8 6
baxterja 75:8bb94685c80b 7 #define DEMOD_EXTRA_TABLE_LENGTH 16
baxterja 75:8bb94685c80b 8 #define TWOPI 6.28318530717959
baxterja 75:8bb94685c80b 9
baxterja 82:f6fbbb8a2139 10 #define DACFREQUENCY 100000
baxterja 82:f6fbbb8a2139 11
baxterja 82:f6fbbb8a2139 12 uint16_t out_val_pre[pre_compute_length+DEMOD_EXTRA_TABLE_LENGTH];
baxterja 82:f6fbbb8a2139 13
baxterja 75:8bb94685c80b 14 float *imod[MAX_NUMBER_DEMOD_FREQ];
baxterja 75:8bb94685c80b 15 float *qmod[MAX_NUMBER_DEMOD_FREQ];
baxterja 82:f6fbbb8a2139 16 float demod_Carrier_Frequency[MAX_NUMBER_DEMOD_FREQ] = {(100000.0/528),10000};
baxterja 82:f6fbbb8a2139 17 float demod_Table_Length[MAX_NUMBER_DEMOD_FREQ] = {pre_compute_length/8,5};
baxterja 78:10b2916b8f5c 18 float demod_Sample_Frequency[MAX_NUMBER_DEMOD_FREQ] = {12500,12500};
baxterja 75:8bb94685c80b 19
baxterja 82:f6fbbb8a2139 20 int gcd(int a, int b)//Greatest common denominator
baxterja 82:f6fbbb8a2139 21 {
baxterja 82:f6fbbb8a2139 22 if(b == 0)
baxterja 82:f6fbbb8a2139 23 return a;
baxterja 82:f6fbbb8a2139 24 else
baxterja 82:f6fbbb8a2139 25 return gcd(b, a % b);
baxterja 82:f6fbbb8a2139 26 }
baxterja 82:f6fbbb8a2139 27 int simple_lcm(int a, int b)//Least common multiple of 2 numbers
baxterja 82:f6fbbb8a2139 28 {
baxterja 82:f6fbbb8a2139 29 abs(a * b) / gcd(a, b);
baxterja 82:f6fbbb8a2139 30 }
baxterja 82:f6fbbb8a2139 31 void calculate_dac_output()
baxterja 82:f6fbbb8a2139 32 {
baxterja 82:f6fbbb8a2139 33 /*
baxterja 82:f6fbbb8a2139 34 int LCM = demod_Table_Length[0];
baxterja 82:f6fbbb8a2139 35 for(int i = 1; i< MAX_NUMBER_DEMOD_FREQ; i++)
baxterja 82:f6fbbb8a2139 36 {
baxterja 82:f6fbbb8a2139 37 LCM = simple_lcm(LCM,demod_Table_Length[i]);
baxterja 82:f6fbbb8a2139 38 }
baxterja 82:f6fbbb8a2139 39
baxterja 82:f6fbbb8a2139 40 uint16_t out_val_pre[LCM+DEMOD_EXTRA_TABLE_LENGTH];
baxterja 82:f6fbbb8a2139 41 */
baxterja 82:f6fbbb8a2139 42
baxterja 82:f6fbbb8a2139 43 for(int precompute_counter = 0; precompute_counter < pre_compute_length+DEMOD_EXTRA_TABLE_LENGTH; precompute_counter++)
baxterja 82:f6fbbb8a2139 44 {
baxterja 82:f6fbbb8a2139 45 out_val_pre[precompute_counter] = 0;
baxterja 82:f6fbbb8a2139 46 }
baxterja 82:f6fbbb8a2139 47
baxterja 82:f6fbbb8a2139 48 for (int i = 0; i<MAX_NUMBER_DEMOD_FREQ; i++)
baxterja 82:f6fbbb8a2139 49 {
baxterja 82:f6fbbb8a2139 50 for(int precompute_counter = 0; precompute_counter < pre_compute_length+DEMOD_EXTRA_TABLE_LENGTH; precompute_counter++)
baxterja 82:f6fbbb8a2139 51 {
baxterja 82:f6fbbb8a2139 52
baxterja 82:f6fbbb8a2139 53 out_val_pre[precompute_counter]+=(cos(TWOPI * demod_Carrier_Frequency[i] / DACFREQUENCY * precompute_counter))*int(4094/(2*MAX_NUMBER_DEMOD_FREQ))+int(4096/(2*MAX_NUMBER_DEMOD_FREQ));
baxterja 82:f6fbbb8a2139 54 }
baxterja 82:f6fbbb8a2139 55 }
baxterja 82:f6fbbb8a2139 56
baxterja 82:f6fbbb8a2139 57 }
baxterja 82:f6fbbb8a2139 58
baxterja 75:8bb94685c80b 59 void precompute_tables()
baxterja 75:8bb94685c80b 60 {
baxterja 75:8bb94685c80b 61 static bool precomputed = false;
baxterja 75:8bb94685c80b 62 if (precomputed)
baxterja 75:8bb94685c80b 63 {
baxterja 75:8bb94685c80b 64 printf("TABLES HAVE ALREADY BEEN PRECOMPUTED");
baxterja 75:8bb94685c80b 65 return;
baxterja 75:8bb94685c80b 66 }
baxterja 75:8bb94685c80b 67 precomputed = true;
baxterja 75:8bb94685c80b 68 for (int i = 0; i<MAX_NUMBER_DEMOD_FREQ; i++)
baxterja 75:8bb94685c80b 69 {
baxterja 75:8bb94685c80b 70 int table_size = demod_Table_Length[i]+DEMOD_EXTRA_TABLE_LENGTH;
baxterja 75:8bb94685c80b 71 imod[i] = new float[table_size];
baxterja 75:8bb94685c80b 72 qmod[i] = new float[table_size];
baxterja 75:8bb94685c80b 73 for(int precompute_counter = 0; precompute_counter < demod_Table_Length[i]+DEMOD_EXTRA_TABLE_LENGTH; precompute_counter++)
baxterja 75:8bb94685c80b 74 {
baxterja 75:8bb94685c80b 75 imod[i][precompute_counter] = ( cos(TWOPI * demod_Carrier_Frequency[i] / demod_Sample_Frequency[i] * precompute_counter));
baxterja 75:8bb94685c80b 76 qmod[i][precompute_counter] = (-sin(TWOPI * demod_Carrier_Frequency[i] / demod_Sample_Frequency[i] * precompute_counter));
baxterja 75:8bb94685c80b 77 }
baxterja 75:8bb94685c80b 78 }
baxterja 82:f6fbbb8a2139 79 calculate_dac_output();
baxterja 75:8bb94685c80b 80
baxterja 75:8bb94685c80b 81 }
baxterja 75:8bb94685c80b 82 void demodulate(float *samples[MAX_NUMBER_OF_FILTERS], int num_filters, int sample_length, int demodulation_frequency)
baxterja 75:8bb94685c80b 83 {
baxterja 78:10b2916b8f5c 84 static int demod_counters[MAX_NUMBER_DEMOD_FREQ] = {0,0};
baxterja 75:8bb94685c80b 85
baxterja 75:8bb94685c80b 86 if (demod_counters[demodulation_frequency]>=demod_Table_Length[demodulation_frequency])
baxterja 75:8bb94685c80b 87 {
baxterja 75:8bb94685c80b 88 demod_counters[demodulation_frequency]-=demod_Table_Length[demodulation_frequency];
baxterja 75:8bb94685c80b 89 }
baxterja 75:8bb94685c80b 90 for(int i = num_filters-1; i>=0; i--)
baxterja 75:8bb94685c80b 91 {
baxterja 75:8bb94685c80b 92 //important keep in this order or filter 0 will be odd
baxterja 75:8bb94685c80b 93 //multiply by -sin
baxterja 75:8bb94685c80b 94 arm_mult_f32(qmod[demodulation_frequency]+demod_counters[demodulation_frequency], samples[i], samples[2*i+1], sample_length);
baxterja 75:8bb94685c80b 95 //multiply by cos
baxterja 75:8bb94685c80b 96 arm_mult_f32(imod[demodulation_frequency]+demod_counters[demodulation_frequency], samples[i], samples[2*i], sample_length);
baxterja 75:8bb94685c80b 97 }
baxterja 75:8bb94685c80b 98 demod_counters[demodulation_frequency] +=sample_length;//increment counter
baxterja 75:8bb94685c80b 99 }