Mercurial > hg > sonic-visualiser
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; |