-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.c
104 lines (88 loc) · 3.8 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* File: main.c
* Author: menezes
*
* Created on October 12, 2017, 6:58 PM
*/
#include <p33EP128MC204.h>
#include "mcc_generated_files/mcc.h"
#include "guitar_tuner.h"
#include <math.h>
extern fractional ping_buffer[NUM_SAMP];
extern fractional pong_buffer[NUM_SAMP];
extern float guitar_notes[NUM_NOTES];
fractcomplex signal_in_complex[NUM_SAMP+NUM_ZEROS]
__attribute__ ((eds, space(ymemory), aligned ((NUM_SAMP+NUM_ZEROS) * 2 *2)));
fractcomplex twiddle_factors[(NUM_SAMP+NUM_ZEROS)/2]
__attribute__ ((section (".xbss, bss, xmemory"), aligned ((NUM_SAMP+NUM_ZEROS)*2)));
fractional hanning_window[NUM_SAMP];
fractional signal_in_Abs[(NUM_SAMP+NUM_ZEROS)/2];
extern uint8_t ping_buffer_full;
extern uint8_t completed_sampling;
int16_t peak_frequency_bin = 0;
float peak_frequency = 0;
fractional spectrum_power;
fractional average_constant;
fractional aux_vector[NUM_SAMP];
fractional average_vector[NUM_SAMP];
fractional signal_in_dc_level = 0;
noteFeatures note_in
__attribute__((far,aligned));
int i = 0;
int main(int argc, char** argv) {
SYSTEM_Initialize();
AD1CON1bits.ADON = 1;
TwidFactorInit(LOG2_NUM_SAMP, &twiddle_factors[0], 0);
HanningInit(NUM_SAMP, hanning_window);
average_constant = Float2Fract(1.0/NUM_SAMP);
FillVector(NUM_SAMP, average_vector, average_constant);
while(1)
{
if(completed_sampling)
{
completed_sampling = NO;
if(ping_buffer_full)
{
signal_in_dc_level = VectorDotProduct(NUM_SAMP, ping_buffer, average_vector);
FillVector(NUM_SAMP, aux_vector, signal_in_dc_level);
VectorSubtract(NUM_SAMP, ping_buffer, ping_buffer, aux_vector); //Remove dc level from signal in
VectorWindow(NUM_SAMP, ping_buffer, ping_buffer, hanning_window);
for(i = 0; i < NUM_SAMP; i++)
{
ping_buffer[i] = ping_buffer[i] << 3;
signal_in_complex[i].real = ping_buffer[i];
signal_in_complex[i].imag = 0;
}
}
else
{
signal_in_dc_level = VectorDotProduct(NUM_SAMP, pong_buffer, average_vector);
FillVector(NUM_SAMP, aux_vector, signal_in_dc_level);
VectorSubtract(NUM_SAMP, pong_buffer, pong_buffer, aux_vector); //Remove dc level from signal in
VectorWindow(NUM_SAMP, pong_buffer, pong_buffer, hanning_window);
for(i = 0; i < NUM_SAMP; i++)
{
pong_buffer[i] = pong_buffer[i] << 3;
signal_in_complex[i].real = pong_buffer[i];
signal_in_complex[i].imag = 0;
}
}
VectorZeroPad(NUM_SAMP, NUM_ZEROS, &signal_in_complex[0].real, &signal_in_complex[0].real);
VectorZeroPad(NUM_SAMP, NUM_ZEROS, &signal_in_complex[0].imag, &signal_in_complex[0].imag);
FFTComplexIP(LOG2_NUM_SAMP, &signal_in_complex[0], &twiddle_factors[0], COEFFS_IN_DATA);
BitReverseComplex(LOG2_NUM_SAMP, &signal_in_complex[0]);
SquareMagnitudeCplx((NUM_SAMP+NUM_ZEROS)/2, &signal_in_complex[0], signal_in_Abs);
signal_in_Abs[0] = 0;
VectorMax((NUM_SAMP+NUM_ZEROS)/2, signal_in_Abs, &peak_frequency_bin);
GrandkeFreqInterpolation(peak_frequency_bin, signal_in_Abs, &peak_frequency);
if(peak_frequency < 500.0)
{
// TMR1_Start();
NoteDetect(peak_frequency, ¬e_in);
ShowNote(¬e_in);
}
int x = 0;
}
}
return 1;
}