Mercurial > hg > svapp
diff audioio/IntegerTimeStretcher.cpp @ 39:4ed2448582cc
* Switch from fftw3 to fftw3f. I think the efficiency improvement is probably
worth the lower precision, although I ought to do a few more tests.
author | Chris Cannam |
---|---|
date | Thu, 15 Jun 2006 12:28:47 +0000 |
parents | 2eb25a26390f |
children |
line wrap: on
line diff
--- a/audioio/IntegerTimeStretcher.cpp Fri May 12 14:40:43 2006 +0000 +++ b/audioio/IntegerTimeStretcher.cpp Thu Jun 15 12:28:47 2006 +0000 @@ -32,16 +32,16 @@ m_inbuf(m_wlen), m_outbuf(maxProcessInputBlockSize * ratio) { - m_window = new Window<double>(windowType, m_wlen), + m_window = new Window<float>(windowType, m_wlen), - m_time = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * m_wlen); - m_freq = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * m_wlen); - m_dbuf = (double *)fftw_malloc(sizeof(double) * m_wlen); + m_time = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * m_wlen); + m_freq = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) * m_wlen); + m_dbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen); - m_plan = fftw_plan_dft_1d(m_wlen, m_time, m_freq, FFTW_FORWARD, FFTW_ESTIMATE); - m_iplan = fftw_plan_dft_c2r_1d(m_wlen, m_freq, m_dbuf, FFTW_ESTIMATE); + m_plan = fftwf_plan_dft_1d(m_wlen, m_time, m_freq, FFTW_FORWARD, FFTW_ESTIMATE); + m_iplan = fftwf_plan_dft_c2r_1d(m_wlen, m_freq, m_dbuf, FFTW_ESTIMATE); - m_mashbuf = new double[m_wlen]; + m_mashbuf = new float[m_wlen]; for (int i = 0; i < m_wlen; ++i) { m_mashbuf[i] = 0.0; } @@ -51,12 +51,12 @@ { std::cerr << "IntegerTimeStretcher::~IntegerTimeStretcher" << std::endl; - fftw_destroy_plan(m_plan); - fftw_destroy_plan(m_iplan); + fftwf_destroy_plan(m_plan); + fftwf_destroy_plan(m_iplan); - fftw_free(m_time); - fftw_free(m_freq); - fftw_free(m_dbuf); + fftwf_free(m_time); + fftwf_free(m_freq); + fftwf_free(m_dbuf); delete m_window; delete m_mashbuf; @@ -69,7 +69,7 @@ } void -IntegerTimeStretcher::process(double *input, double *output, size_t samples) +IntegerTimeStretcher::process(float *input, float *output, size_t samples) { // We need to add samples from input to our internal buffer. When // we have m_windowSize samples in the buffer, we can process it, @@ -163,7 +163,7 @@ } void -IntegerTimeStretcher::processBlock(double *buf, double *out) +IntegerTimeStretcher::processBlock(float *buf, float *out) { size_t i; @@ -177,7 +177,7 @@ m_window->cut(buf); for (i = 0; i < m_wlen/2; ++i) { - double temp = buf[i]; + float temp = buf[i]; buf[i] = buf[i + m_wlen/2]; buf[i + m_wlen/2] = temp; } @@ -187,27 +187,27 @@ m_time[i][1] = 0.0; } - fftw_execute(m_plan); // m_time -> m_freq + fftwf_execute(m_plan); // m_time -> m_freq for (i = 0; i < m_wlen; ++i) { - double mag = sqrt(m_freq[i][0] * m_freq[i][0] + + float mag = sqrtf(m_freq[i][0] * m_freq[i][0] + m_freq[i][1] * m_freq[i][1]); - double phase = atan2(m_freq[i][1], m_freq[i][0]); + float phase = atan2f(m_freq[i][1], m_freq[i][0]); phase = phase * m_ratio; - double real = mag * cos(phase); - double imag = mag * sin(phase); + float real = mag * cosf(phase); + float imag = mag * sinf(phase); m_freq[i][0] = real; m_freq[i][1] = imag; } - fftw_execute(m_iplan); // m_freq -> in, inverse fft + fftwf_execute(m_iplan); // m_freq -> in, inverse fft for (i = 0; i < m_wlen/2; ++i) { - double temp = buf[i] / m_wlen; + float temp = buf[i] / m_wlen; buf[i] = buf[i + m_wlen/2] / m_wlen; buf[i + m_wlen/2] = temp; }