diff options
author | John Glover <j@johnglover.net> | 2012-08-21 18:31:07 +0100 |
---|---|---|
committer | John Glover <j@johnglover.net> | 2012-08-21 18:31:07 +0100 |
commit | 39e0005e226ed6f04562e9d5d7548782fef81c20 (patch) | |
tree | 5f4b23a8563a47ac8740525acc2f96565e88d002 /src/sndobj/IFFT.cpp | |
parent | 4f0a4f251ddbc466f14200202eff2213e30a5919 (diff) | |
download | simpl-39e0005e226ed6f04562e9d5d7548782fef81c20.tar.gz simpl-39e0005e226ed6f04562e9d5d7548782fef81c20.tar.bz2 simpl-39e0005e226ed6f04562e9d5d7548782fef81c20.zip |
[sndobj] Update SndObj to use FFTW v3 (was using v2). Remove unused SndObj files. Whitespace clean up.
Diffstat (limited to 'src/sndobj/IFFT.cpp')
-rw-r--r-- | src/sndobj/IFFT.cpp | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/src/sndobj/IFFT.cpp b/src/sndobj/IFFT.cpp deleted file mode 100644 index 01f693b..0000000 --- a/src/sndobj/IFFT.cpp +++ /dev/null @@ -1,262 +0,0 @@ - -//////////////////////////////////////////////////////////////////////// -// This file is part of the SndObj library -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// Copyright (c)Victor Lazzarini, 1997-2004 -// See License.txt for a disclaimer of all warranties -// and licensing information - -///////////////////////////////////////////////// -// IFFT.cpp: implementation of the IFFT class -// short-time inverse fast fourier transform -// Victor Lazzarini, 2003 -///////////////////////////////////////////////// -#include "IFFT.h" - - -IFFT::IFFT(){ - - m_table = 0; - - // vectorsize equals hopsize - // so that each call of DoProcess adds a - // new window to the overlap-add process - - m_hopsize = DEF_VECSIZE; - m_fftsize = DEF_FFTSIZE; - m_frames = m_fftsize/m_hopsize; - - m_sigframe = new double*[m_frames]; - m_ffttmp = new double[m_fftsize]; - m_counter = new int[m_frames]; - m_halfsize = m_fftsize/2; - m_fund = m_sr/m_fftsize; - int i; - memset(m_ffttmp, 0, m_fftsize*sizeof(double)); - for(i = 0; i < m_frames; i++){ - m_sigframe[i] = new double[m_fftsize]; - memset(m_sigframe[i], 0, m_fftsize*sizeof(double)); - m_counter[i] = i*m_hopsize; - } - - m_plan = rfftw_create_plan(m_fftsize, FFTW_COMPLEX_TO_REAL, FFTW_ESTIMATE); - - AddMsg("fft size", 21); - AddMsg("hop size", 22); - AddMsg("window", 23); - - m_cur = 0; -} - -IFFT::IFFT(Table* window, SndObj* input, int fftsize, int hopsize, - double sr): - SndObj(input,hopsize, sr) -{ - - m_table = window; - - m_hopsize = hopsize; - m_fftsize = fftsize; - - if(m_fftsize){ - m_frames = m_fftsize/m_hopsize; - - m_sigframe = new double*[m_frames]; - m_ffttmp = new double[m_fftsize]; - m_counter = new int[m_frames]; - m_halfsize = m_fftsize/2; - m_fund = m_sr/m_fftsize; - memset(m_ffttmp, 0, m_fftsize*sizeof(double)); - int i; - for(i = 0; i < m_frames; i++){ - m_sigframe[i] = new double[m_fftsize]; - memset(m_sigframe[i], 0, m_fftsize*sizeof(double)); - m_counter[i] = i*m_hopsize; - } - - m_plan = rfftw_create_plan(m_fftsize, FFTW_COMPLEX_TO_REAL, FFTW_ESTIMATE); - } - - AddMsg("fft size", 21); - AddMsg("hop size", 22); - AddMsg("window", 23); - - m_cur = 0; -} - -IFFT::~IFFT(){ - - if(m_fftsize){ -#ifndef WIN - rfftw_destroy_plan(m_plan); -#endif - delete[] m_counter; - delete[] m_ffttmp; - delete[] m_sigframe; - } -} - -void -IFFT::SetFFTSize(int fftsize){ - m_fftsize = fftsize; - ReInit(); -} - -void -IFFT::SetHopSize(int hopsize){ - SetVectorSize(m_hopsize = hopsize); - ReInit(); -} - -void -IFFT::ReInit(){ - - rfftw_destroy_plan(m_plan); - delete[] m_counter; - delete[] m_sigframe; - delete[] m_ffttmp; - delete[] m_output; - - if(!(m_output = new double[m_vecsize])){ - m_error = 1; -#ifdef DEBUG - cout << ErrorMessage(); -#endif - return; - } - - - m_frames = m_fftsize/m_hopsize; - m_sigframe = new double*[m_frames]; - m_ffttmp = new double[m_fftsize]; - m_counter = new int[m_frames]; - m_halfsize = m_fftsize/2; - m_fund = m_sr/m_fftsize; - int i; - for(i = 0; i < m_frames; i++){ - m_sigframe[i] = new double[m_fftsize]; - memset(m_sigframe[i], 0, m_fftsize*sizeof(double)); - m_counter[i] = i*m_hopsize; - } - - m_plan = rfftw_create_plan(m_vecsize, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE); - m_cur =0; - -} - - -int -IFFT::Set(char* mess, double value){ - - switch(FindMsg(mess)){ - - case 21: - SetFFTSize((int) value); - return 1; - - case 22: - SetHopSize((int) value); - return 1; - - default: - return SndObj::Set(mess, value); - - } -} - -int -IFFT::Connect(char* mess, void *input){ - - switch(FindMsg(mess)){ - - case 23: - SetWindow((Table *) input); - return 1; - - default: - return SndObj::Connect(mess, input); - - } - -} - -short -IFFT::DoProcess(){ - - - if(!m_error){ - if(m_input && m_table){ - if(m_enable){ - int i; double out = 0.; - // Put the input fftframe into - // the current (free) signal frame - // and transform it - ifft(m_sigframe[m_cur]); - // set the current signal frame to the next - // one in the circular list - m_counter[m_cur] = 0; - m_cur--; if(m_cur<0) m_cur = m_frames-1; - - for(m_vecpos = 0; m_vecpos < m_vecsize; m_vecpos++){ - // overlap-add the time-domain signal frames - for(i=0; i < m_frames; i++){ - out += m_sigframe[i][m_counter[i]]*m_table->Lookup(m_counter[i]); - m_counter[i]++; - } - // output it. - m_output[m_vecpos] = (double) out; - out = 0.; - } - - return 1; - } else { // if disabled - for(m_vecpos = 0; m_vecpos < m_vecsize; m_vecpos++) - m_output[m_vecpos] = 0.f; - return 1; - } - } else { - m_error = 3; - return 0; - } - } - else - return 0; -} - - - - -void -IFFT::ifft(double* signal) { - - // get input FFT frame and - // prepare data for fftw - - m_ffttmp[0] = m_input->Output(0); - m_ffttmp[m_halfsize] = m_input->Output(1); - for(int i=2, i2=1; i<m_fftsize; i+=2){ - i2 = i/2; - m_ffttmp[i2] = m_input->Output(i); - m_ffttmp[m_fftsize-(i2)] = m_input->Output(i+1); - } - - // Inverse FFT function - rfftw_one(m_plan, m_ffttmp, signal); - -} - - |