Jared Baxter
/
Impedance_Fast_Circuitry
Fork of DSP_200kHz by
Jareds_DSP/demodulate.cpp@82:f6fbbb8a2139, 2017-08-30 (annotated)
- 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?
User | Revision | Line number | New 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 | } |