comparison audioio/PhaseVocoderTimeStretcher.cpp @ 100:f3516e520652

* Add non-fftw3 fft alternative
author Chris Cannam
date Fri, 09 Feb 2007 11:32:34 +0000
parents 9918c8a3f904
children 006c90387f40
comparison
equal deleted inserted replaced
99:77267127a8ce 100:f3516e520652
60 m_synthesisWindow = new Window<float>(HanningWindow, m_wlen); 60 m_synthesisWindow = new Window<float>(HanningWindow, m_wlen);
61 61
62 m_prevPhase = new float *[m_channels]; 62 m_prevPhase = new float *[m_channels];
63 m_prevAdjustedPhase = new float *[m_channels]; 63 m_prevAdjustedPhase = new float *[m_channels];
64 64
65 m_prevTransientMag = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1)); 65 m_prevTransientMag = (float *)fftf_malloc(sizeof(float) * (m_wlen / 2 + 1));
66 m_prevTransientScore = 0; 66 m_prevTransientScore = 0;
67 m_prevTransient = false; 67 m_prevTransient = false;
68 68
69 m_tempbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen); 69 m_tempbuf = (float *)fftf_malloc(sizeof(float) * m_wlen);
70 70
71 m_time = new float *[m_channels]; 71 m_time = new float *[m_channels];
72 m_freq = new fftwf_complex *[m_channels]; 72 m_freq = new fftf_complex *[m_channels];
73 m_plan = new fftwf_plan[m_channels]; 73 m_plan = new fftf_plan[m_channels];
74 m_iplan = new fftwf_plan[m_channels]; 74 m_iplan = new fftf_plan[m_channels];
75 75
76 m_inbuf = new RingBuffer<float> *[m_channels]; 76 m_inbuf = new RingBuffer<float> *[m_channels];
77 m_outbuf = new RingBuffer<float> *[m_channels]; 77 m_outbuf = new RingBuffer<float> *[m_channels];
78 m_mashbuf = new float *[m_channels]; 78 m_mashbuf = new float *[m_channels];
79 79
80 m_modulationbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen); 80 m_modulationbuf = (float *)fftf_malloc(sizeof(float) * m_wlen);
81 81
82 for (size_t c = 0; c < m_channels; ++c) { 82 for (size_t c = 0; c < m_channels; ++c) {
83 83
84 m_prevPhase[c] = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1)); 84 m_prevPhase[c] = (float *)fftf_malloc(sizeof(float) * (m_wlen / 2 + 1));
85 m_prevAdjustedPhase[c] = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1)); 85 m_prevAdjustedPhase[c] = (float *)fftf_malloc(sizeof(float) * (m_wlen / 2 + 1));
86 86
87 m_time[c] = (float *)fftwf_malloc(sizeof(float) * m_wlen); 87 m_time[c] = (float *)fftf_malloc(sizeof(float) * m_wlen);
88 m_freq[c] = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * 88 m_freq[c] = (fftf_complex *)fftf_malloc(sizeof(fftf_complex) *
89 (m_wlen / 2 + 1)); 89 (m_wlen / 2 + 1));
90 90
91 m_plan[c] = fftwf_plan_dft_r2c_1d(m_wlen, m_time[c], m_freq[c], FFTW_ESTIMATE); 91 m_plan[c] = fftf_plan_dft_r2c_1d(m_wlen, m_time[c], m_freq[c], FFTW_ESTIMATE);
92 m_iplan[c] = fftwf_plan_dft_c2r_1d(m_wlen, m_freq[c], m_time[c], FFTW_ESTIMATE); 92 m_iplan[c] = fftf_plan_dft_c2r_1d(m_wlen, m_freq[c], m_time[c], FFTW_ESTIMATE);
93 93
94 m_outbuf[c] = new RingBuffer<float> 94 m_outbuf[c] = new RingBuffer<float>
95 ((m_maxOutputBlockSize + m_wlen) * 2); 95 ((m_maxOutputBlockSize + m_wlen) * 2);
96 m_inbuf[c] = new RingBuffer<float> 96 m_inbuf[c] = new RingBuffer<float>
97 (lrintf(m_outbuf[c]->getSize() / m_ratio) + m_wlen); 97 (lrintf(m_outbuf[c]->getSize() / m_ratio) + m_wlen);
98 98
99 std::cerr << "making inbuf size " << m_inbuf[c]->getSize() << " (outbuf size is " << m_outbuf[c]->getSize() << ", ratio " << m_ratio << ")" << std::endl; 99 std::cerr << "making inbuf size " << m_inbuf[c]->getSize() << " (outbuf size is " << m_outbuf[c]->getSize() << ", ratio " << m_ratio << ")" << std::endl;
100 100
101 101
102 m_mashbuf[c] = (float *)fftwf_malloc(sizeof(float) * m_wlen); 102 m_mashbuf[c] = (float *)fftf_malloc(sizeof(float) * m_wlen);
103 103
104 for (size_t i = 0; i < m_wlen; ++i) { 104 for (size_t i = 0; i < m_wlen; ++i) {
105 m_mashbuf[c][i] = 0.0; 105 m_mashbuf[c][i] = 0.0;
106 } 106 }
107 107
186 { 186 {
187 std::cerr << "PhaseVocoderTimeStretcher::cleanup" << std::endl; 187 std::cerr << "PhaseVocoderTimeStretcher::cleanup" << std::endl;
188 188
189 for (size_t c = 0; c < m_channels; ++c) { 189 for (size_t c = 0; c < m_channels; ++c) {
190 190
191 fftwf_destroy_plan(m_plan[c]); 191 fftf_destroy_plan(m_plan[c]);
192 fftwf_destroy_plan(m_iplan[c]); 192 fftf_destroy_plan(m_iplan[c]);
193 193
194 fftwf_free(m_time[c]); 194 fftf_free(m_time[c]);
195 fftwf_free(m_freq[c]); 195 fftf_free(m_freq[c]);
196 196
197 fftwf_free(m_mashbuf[c]); 197 fftf_free(m_mashbuf[c]);
198 fftwf_free(m_prevPhase[c]); 198 fftf_free(m_prevPhase[c]);
199 fftwf_free(m_prevAdjustedPhase[c]); 199 fftf_free(m_prevAdjustedPhase[c]);
200 200
201 delete m_inbuf[c]; 201 delete m_inbuf[c];
202 delete m_outbuf[c]; 202 delete m_outbuf[c];
203 } 203 }
204 204
205 fftwf_free(m_tempbuf); 205 fftf_free(m_tempbuf);
206 fftwf_free(m_modulationbuf); 206 fftf_free(m_modulationbuf);
207 fftwf_free(m_prevTransientMag); 207 fftf_free(m_prevTransientMag);
208 208
209 delete[] m_prevPhase; 209 delete[] m_prevPhase;
210 delete[] m_prevAdjustedPhase; 210 delete[] m_prevAdjustedPhase;
211 delete[] m_inbuf; 211 delete[] m_inbuf;
212 delete[] m_outbuf; 212 delete[] m_outbuf;
507 507
508 for (i = 0; i < m_wlen; ++i) { 508 for (i = 0; i < m_wlen; ++i) {
509 m_time[c][i] = buf[i]; 509 m_time[c][i] = buf[i];
510 } 510 }
511 511
512 fftwf_execute(m_plan[c]); // m_time -> m_freq 512 fftf_execute(m_plan[c]); // m_time -> m_freq
513 } 513 }
514 514
515 bool 515 bool
516 PhaseVocoderTimeStretcher::isTransient() 516 PhaseVocoderTimeStretcher::isTransient()
517 { 517 {
593 593
594 m_prevPhase[c][i] = phase; 594 m_prevPhase[c][i] = phase;
595 m_prevAdjustedPhase[c][i] = adjustedPhase; 595 m_prevAdjustedPhase[c][i] = adjustedPhase;
596 } 596 }
597 597
598 fftwf_execute(m_iplan[c]); // m_freq -> m_time, inverse fft 598 fftf_execute(m_iplan[c]); // m_freq -> m_time, inverse fft
599 599
600 for (size_t i = 0; i < m_wlen/2; ++i) { 600 for (size_t i = 0; i < m_wlen/2; ++i) {
601 float temp = m_time[c][i]; 601 float temp = m_time[c][i];
602 m_time[c][i] = m_time[c][i + m_wlen/2]; 602 m_time[c][i] = m_time[c][i + m_wlen/2];
603 m_time[c][i + m_wlen/2] = temp; 603 m_time[c][i + m_wlen/2] = temp;