rt300@4
|
1 //
|
rt300@4
|
2 // frequencer.cpp
|
rt300@4
|
3 // oscSenderExample
|
rt300@4
|
4 //
|
rt300@4
|
5 // Created by Robert Tubb on 27/11/2012.
|
rt300@4
|
6 //
|
rt300@4
|
7 //
|
rt300@4
|
8
|
rt300@4
|
9 #include "frequencer.h"
|
rt300@4
|
10 Frequencer frequencer;
|
rt300@4
|
11
|
rt300@4
|
12 Frequencer::Frequencer(){
|
rt300@4
|
13
|
rt300@4
|
14 N = 16;
|
rt300@4
|
15
|
rt300@4
|
16 for(int i = 0; i<N;i++){
|
rt300@4
|
17 timePoints.push_back(0.0);
|
rt300@4
|
18 freqMag.push_back(0.0);
|
rt300@4
|
19 freqPhase.push_back(0.0);
|
rt300@4
|
20 }
|
rt300@4
|
21
|
rt300@4
|
22 }
|
rt300@4
|
23 /////////////////////////////////////////////////////
|
rt300@4
|
24 /////////////////////////////////////////////////////
|
rt300@9
|
25 // No time domain!
|
rt300@4
|
26 void Frequencer::timeEdit(int n, double value){
|
rt300@4
|
27
|
rt300@4
|
28 // update internal
|
rt300@4
|
29 timePoints[n] = value;
|
rt300@4
|
30
|
rt300@4
|
31 // calculate transform
|
rt300@4
|
32 dft();
|
rt300@4
|
33
|
rt300@4
|
34 }
|
rt300@4
|
35
|
rt300@4
|
36 void Frequencer::timeEdit(vector<double> allValues){
|
rt300@4
|
37
|
rt300@4
|
38 // update internal
|
rt300@4
|
39 vector<double>::iterator iter;
|
rt300@4
|
40 vector<double>::iterator iter2;
|
rt300@4
|
41 iter = allValues.begin();
|
rt300@4
|
42 iter2 = timePoints.begin();
|
rt300@4
|
43 for (iter = allValues.begin(); iter < allValues.end(); iter++,iter2++){
|
rt300@4
|
44 *iter = *iter2;
|
rt300@4
|
45 }
|
rt300@4
|
46
|
rt300@4
|
47
|
rt300@4
|
48 // calculate transform
|
rt300@4
|
49 dft();
|
rt300@4
|
50
|
rt300@4
|
51 //TODO output freq domain - to PD
|
rt300@4
|
52
|
rt300@4
|
53 }
|
rt300@4
|
54
|
rt300@4
|
55 /////////////////////////////////////////////////////
|
rt300@4
|
56 /////////////////////////////////////////////////////
|
rt300@4
|
57
|
rt300@4
|
58
|
rt300@4
|
59 vector<double> Frequencer::freqMagEdit(vector<int> indexes, vector<double> values){
|
rt300@4
|
60 if(indexes.size() != values.size()){
|
rt300@4
|
61 cout << "freqMagEdit error: indexes dont match values\n";
|
rt300@4
|
62 return timePoints;
|
rt300@4
|
63 }
|
rt300@4
|
64 // put into local store,
|
rt300@4
|
65 for(int i=0;i<indexes.size();i++){
|
rt300@4
|
66 freqMag[indexes[i]] = values[i];
|
rt300@20
|
67 if(i!=0)freqMag[N-indexes[i]] = freqMag[indexes[i]];
|
rt300@4
|
68 }
|
rt300@4
|
69
|
rt300@4
|
70 // calculate transform
|
rt300@4
|
71 idft();
|
rt300@4
|
72
|
rt300@4
|
73 return timePoints;
|
rt300@4
|
74 }
|
rt300@4
|
75
|
rt300@4
|
76
|
rt300@4
|
77 /////////////////////////////////////////////////////
|
rt300@4
|
78 /////////////////////////////////////////////////////
|
rt300@4
|
79
|
rt300@4
|
80 void Frequencer::freqPhaseEdit(int k, double phase){
|
rt300@4
|
81 N = 16;
|
rt300@4
|
82 // put into local store
|
rt300@4
|
83 freqPhase[k] = phase;
|
rt300@4
|
84
|
rt300@4
|
85 // making sure to conjugate
|
rt300@20
|
86 if(k!=0)freqPhase[N-k] = - freqPhase[k];
|
rt300@4
|
87 // calculate transform
|
rt300@4
|
88 idft();
|
rt300@4
|
89 // TODO output time domain
|
rt300@4
|
90
|
rt300@4
|
91 }
|
rt300@4
|
92
|
rt300@4
|
93 /////////////////////////////////////////////////////
|
rt300@4
|
94 /////////////////////////////////////////////////////
|
rt300@4
|
95
|
rt300@4
|
96 void Frequencer::dft(){
|
rt300@4
|
97
|
rt300@4
|
98 // we have 16 time points. work out freqs and phases
|
rt300@4
|
99 int n = 0;
|
rt300@4
|
100 int k = 0;
|
rt300@4
|
101 double xre = 0.;
|
rt300@4
|
102 double xim = 0.;
|
rt300@4
|
103
|
rt300@4
|
104 for(k=0; k < N; k++){
|
rt300@4
|
105 // work out xn
|
rt300@4
|
106 xre = 0.;
|
rt300@4
|
107 xim = 0.;
|
rt300@4
|
108 for(n=0;n < N;n++){
|
rt300@4
|
109 xre = xre + timePoints[n]*cos( (2.*PI/(float)N)*n*k);
|
rt300@4
|
110 xim = xim + timePoints[n]*sin( (2.*PI/(float)N)*n*k);
|
rt300@4
|
111
|
rt300@4
|
112 }
|
rt300@4
|
113 freqMag[k] = sqrt(pow(xre,2) + pow(xim,2.)); // MAGNITUDE
|
rt300@4
|
114 freqPhase[k] = -atan2(xim,xre);
|
rt300@4
|
115 }
|
rt300@4
|
116
|
rt300@4
|
117 }
|
rt300@4
|
118
|
rt300@4
|
119
|
rt300@4
|
120
|
rt300@4
|
121 /////////////////////////////////////////////////////
|
rt300@4
|
122 /////////////////////////////////////////////////////
|
rt300@4
|
123
|
rt300@4
|
124 void Frequencer::idft(){
|
rt300@4
|
125
|
rt300@4
|
126 // we have some freqs and phases. work out real time points (conj)
|
rt300@4
|
127 int n = 0;
|
rt300@4
|
128 int k = 0;
|
rt300@4
|
129 double xre = 0.;
|
rt300@4
|
130 double xim = 0.;
|
rt300@4
|
131
|
rt300@4
|
132 for(n=0; n < N; n++){
|
rt300@4
|
133 // work out xn
|
rt300@4
|
134 xre = 0.;
|
rt300@4
|
135 xim = 0.;
|
rt300@4
|
136 for(k=0;k < N;k++){
|
rt300@4
|
137 xre = xre + freqMag[k]*cos( (2.*PI/(float)N)*n*k + freqPhase[k]);
|
rt300@4
|
138
|
rt300@4
|
139 }
|
rt300@4
|
140 timePoints[n] = xre/(float)N; // divided by N ???
|
rt300@4
|
141 }
|
rt300@4
|
142
|
rt300@4
|
143 }
|
rt300@4
|
144 /////////////////////////////////////////////////////
|
rt300@4
|
145 ///////////////////////////////////////////////////// |