annotate frequencer.mm @ 15:e45c3e631d20

View fiddling
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Thu, 17 Jan 2013 13:01:19 +0000
parents 346807b47860
children e44dc6f7f12e
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@9 67 freqMag[N-indexes[i]-1] = 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@4 86
rt300@9 87 freqPhase[N-k-1] = - freqPhase[k];
rt300@4 88
rt300@4 89 // calculate transform
rt300@4 90 idft();
rt300@4 91 // TODO output time domain
rt300@4 92
rt300@4 93 }
rt300@4 94
rt300@4 95 /////////////////////////////////////////////////////
rt300@4 96 /////////////////////////////////////////////////////
rt300@4 97
rt300@4 98 void Frequencer::dft(){
rt300@4 99
rt300@4 100 // we have 16 time points. work out freqs and phases
rt300@4 101 int n = 0;
rt300@4 102 int k = 0;
rt300@4 103 double xre = 0.;
rt300@4 104 double xim = 0.;
rt300@4 105
rt300@4 106 for(k=0; k < N; k++){
rt300@4 107 // work out xn
rt300@4 108 xre = 0.;
rt300@4 109 xim = 0.;
rt300@4 110 for(n=0;n < N;n++){
rt300@4 111 xre = xre + timePoints[n]*cos( (2.*PI/(float)N)*n*k);
rt300@4 112 xim = xim + timePoints[n]*sin( (2.*PI/(float)N)*n*k);
rt300@4 113
rt300@4 114 }
rt300@4 115 freqMag[k] = sqrt(pow(xre,2) + pow(xim,2.)); // MAGNITUDE
rt300@4 116 freqPhase[k] = -atan2(xim,xre);
rt300@4 117 }
rt300@4 118
rt300@4 119 }
rt300@4 120
rt300@4 121
rt300@4 122
rt300@4 123 /////////////////////////////////////////////////////
rt300@4 124 /////////////////////////////////////////////////////
rt300@4 125
rt300@4 126 void Frequencer::idft(){
rt300@4 127
rt300@4 128 // we have some freqs and phases. work out real time points (conj)
rt300@4 129 int n = 0;
rt300@4 130 int k = 0;
rt300@4 131 double xre = 0.;
rt300@4 132 double xim = 0.;
rt300@4 133
rt300@4 134 for(n=0; n < N; n++){
rt300@4 135 // work out xn
rt300@4 136 xre = 0.;
rt300@4 137 xim = 0.;
rt300@4 138 for(k=0;k < N;k++){
rt300@4 139 xre = xre + freqMag[k]*cos( (2.*PI/(float)N)*n*k + freqPhase[k]);
rt300@4 140
rt300@4 141 }
rt300@4 142 timePoints[n] = xre/(float)N; // divided by N ???
rt300@4 143 }
rt300@4 144
rt300@4 145 }
rt300@4 146 /////////////////////////////////////////////////////
rt300@4 147 /////////////////////////////////////////////////////