annotate frequencer.mm @ 49:178642d134a7 tip

xtra files
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 01 May 2013 17:34:33 +0100
parents e44dc6f7f12e
children
rev   line source
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 /////////////////////////////////////////////////////