#include "ShortFastFourierTransform.h"
#include "message.h"
#include "ProgramVector.h"
#include "ServiceCall.h"
#ifdef ARM_CORTEX
ShortFastFourierTransform::ShortFastFourierTransform(){}
ShortFastFourierTransform::ShortFastFourierTransform(int len){
init(len);
}
ShortFastFourierTransform::~ShortFastFourierTransform(){}
void ShortFastFourierTransform::init(int aSize){
len = aSize;
ASSERT(len==32 || len ==64 || len==128 || len==256 || len==512 || len==1024 || len==2048 || len==4096, "Unsupported FFT size");
void* args[] = {(void*)&instance, (void*)&len};
}
void ShortFastFourierTransform::fft(ShortArray in, ComplexShortArray out){
ASSERT(in.getSize() >= getSize(), "Input array too small");
ASSERT(out.getSize() >= getSize(), "Output array too small");
arm_rfft_init_q15(&instance, len, 0, 1);
arm_rfft_q15(&instance, (int16_t*)in.getData(), (int16_t*)out.getData());
}
void ShortFastFourierTransform::ifft(ComplexShortArray in, ShortArray out){
ASSERT(in.getSize() >= getSize(), "Input array too small");
ASSERT(out.getSize() >= getSize(), "Output array too small");
arm_rfft_init_q15(&instance, len, 1, 1);
arm_rfft_q15(&instance, (int16_t*)in.getData(), (int16_t*)out.getData());
}
size_t ShortFastFourierTransform::getSize(){
return len;
}
#else
ShortFastFourierTransform::ShortFastFourierTransform(){}
ShortFastFourierTransform::ShortFastFourierTransform(int aSize){
init(aSize);
}
ShortFastFourierTransform::~ShortFastFourierTransform(){
ASSERT(false, "TODO");
ComplexShortArray::destroy(temp);
}
void ShortFastFourierTransform::init(int aSize){
ASSERT(aSize==32 || aSize ==64 || aSize==128 || aSize==256 || aSize==512 || aSize==1024 || aSize==2048 || aSize==4096, "Unsupported FFT size");
cfgfft = kiss_fft_alloc(aSize, 0 , 0, 0);
cfgifft = kiss_fft_alloc(aSize, 1,0, 0);
temp = ComplexShortArray::create(getSize());
}
void ShortFastFourierTransform::fft(ShortArray input, ComplexShortArray output){
ASSERT(input.getSize() >= getSize(), "Input array too small");
ASSERT(output.getSize() >= getSize(), "Output array too small");
for(size_t n=0; n<getSize(); n++){
temp[n].re=input[n];
temp[n].im=0;
}
kiss_fft(cfgfft, (kiss_fft_cpx*)(int16_t*)temp.getData(), (kiss_fft_cpx*)(int16_t*)output.getData());
}
void ShortFastFourierTransform::ifft(ComplexShortArray input, ShortArray output){
ASSERT(input.getSize() >= getSize(), "Input array too small");
ASSERT(output.getSize() >= getSize(), "Output array too small");
kiss_fft(cfgifft, (kiss_fft_cpx*)(int16_t*)input.getData(), (kiss_fft_cpx*)(int16_t*)temp.getData());
float scale=1.0f/getSize();
for(size_t n=0; n<getSize(); n++){
output[n]=temp[n].re*scale;
}
}
size_t ShortFastFourierTransform::getSize(){
return temp.getSize();
}
#endif