[戻る]
一括表示

dsPICを使ったFFT関数 投稿者:su- 投稿日:2018/08/07(Tue) 15:20:08 No.1194

初めまして。
このサイトを参考にdsPIC33FJ64GP804を使ったFFT変換をやっています。

#define LOG2N 7
#define FFT_SIZE 128 //=2^7
#define NUM_TAPS 13
unsigned int Index;
unsigned int flag;
fractional SigIn[FFT_SIZE];
fractional FilterOut[FFT_SIZE];
fractcomplex fftBuffer[ FFT_SIZE ] __attribute__ ((space(ymemory), aligned (FFT_SIZE * 2 * 2))); // Place fftBuffer in Y-memory aligned to the size the array in bytes
fractional window[FFT_SIZE]; // Hamming window
fractional powerspec[FFT_SIZE]; // Power Spectrum
fractcomplex twiddleFactors[ FFT_SIZE/2 ]__attribute__((space(xmemory)));
fractional _YBSS(128) delay[FFT_SIZE];
/*const fractional hpfCoeffs[NUM_TAPS] __attribute__ ((space(auto_psv), aligned (FFT_SIZE * 2 * 2))) ={
3,21,30,5,-61,-119,-76,99,296,292,-49,-560,-771,-262,856,1756,1305,-1093,-4854,-8327,23029,-8327,-4854,-1093,1305,1756,856,-262,-771,-560,-49,292,296,99,-76,-119,-61,5,30,21,3,0
}; //filter coefficient
FIRStruct HPF; //HPF fc1=1000 fc2=2000 */
const fractional lpfCoeffs[NUM_TAPS] __attribute__ ((space(auto_psv), aligned (FFT_SIZE * 2 * 2))) ={
1424,-2012,-1898,131,4372,8848,10772,8848,4372,131,-1898,-2012,1424
}; //filter coefficient
FIRStruct LPF; //LPF fc1=1000 fc2=2000


TwidFactorInit(LOG2N, twiddleFactors, 0);
HammingInit (FFT_SIZE, window);
FIRStructInit( &LPF, NUM_TAPS, (fractional *)lpfCoeffs, PSVPAG, delay );
FIRDelayInit (&LPF);

DISICNT = 0x0000; //enable interruput
while(1)
{
//while(!flag);
//flag = 0;
for(j = 0; j < FFT_SIZE; j++)
FIR (1, &FilterOut[j], &SigIn[j], &LPF);
VectorWindow(FFT_SIZE, FilterOut, FilterOut, window);
for(i = 0; i < FFT_SIZE; i++) {
fftBuffer[i].real = FilterOut[i];
fftBuffer[i].imag = 0;
}

FFTComplexIP(LOG2N, fftBuffer, twiddleFactors, COEFFS_IN_DATA);
BitReverseComplex(LOG2N, fftBuffer );
SquareMagnitudeCplx( FFT_SIZE , fftBuffer, powerspec);


以上のようなプログラミングを組みました。変数bufferとpowerspecをdsPICworksを用いてFFTの結果を確認しています。fftbufferまではうまくいくのですが、パワースペクトルであるpowerspecがうまくいかず、値がすべて0になってしまいます。引数が間違っているのでしょうか。

是非ご教授ください。
よろしくお願いいたします。

Re: dsPICを使ったFFT関数 投稿者:Gokan 投稿日:2018/08/13(Mon) 09:40:07 No.1196

多分、SquareMagnitudeCplx関数の最初のパラメータが間違って
いるのだと思います。 FFT_SIZE/2 にする必要があります。


> 初めまして。
> このサイトを参考にdsPIC33FJ64GP804を使ったFFT変換をやっています。
>
> #define LOG2N 7
> #define FFT_SIZE 128 //=2^7
> #define NUM_TAPS 13
> unsigned int Index;
> unsigned int flag;
> fractional SigIn[FFT_SIZE];
> fractional FilterOut[FFT_SIZE];
> fractcomplex fftBuffer[ FFT_SIZE ] __attribute__ ((space(ymemory), aligned (FFT_SIZE * 2 * 2))); // Place fftBuffer in Y-memory aligned to the size the array in bytes
> fractional window[FFT_SIZE]; // Hamming window
> fractional powerspec[FFT_SIZE]; // Power Spectrum
> fractcomplex twiddleFactors[ FFT_SIZE/2 ]__attribute__((space(xmemory)));
> fractional _YBSS(128) delay[FFT_SIZE];
> /*const fractional hpfCoeffs[NUM_TAPS] __attribute__ ((space(auto_psv), aligned (FFT_SIZE * 2 * 2))) ={
> 3,21,30,5,-61,-119,-76,99,296,292,-49,-560,-771,-262,856,1756,1305,-1093,-4854,-8327,23029,-8327,-4854,-1093,1305,1756,856,-262,-771,-560,-49,292,296,99,-76,-119,-61,5,30,21,3,0
> }; //filter coefficient
> FIRStruct HPF; //HPF fc1=1000 fc2=2000 */
> const fractional lpfCoeffs[NUM_TAPS] __attribute__ ((space(auto_psv), aligned (FFT_SIZE * 2 * 2))) ={
> 1424,-2012,-1898,131,4372,8848,10772,8848,4372,131,-1898,-2012,1424
> }; //filter coefficient
> FIRStruct LPF; //LPF fc1=1000 fc2=2000
>
>
> TwidFactorInit(LOG2N, twiddleFactors, 0);
> HammingInit (FFT_SIZE, window);
> FIRStructInit( &LPF, NUM_TAPS, (fractional *)lpfCoeffs, PSVPAG, delay );
> FIRDelayInit (&LPF);
>
> DISICNT = 0x0000; //enable interruput
> while(1)
> {
> //while(!flag);
> //flag = 0;
> for(j = 0; j < FFT_SIZE; j++)
> FIR (1, &FilterOut[j], &SigIn[j], &LPF);
> VectorWindow(FFT_SIZE, FilterOut, FilterOut, window);
> for(i = 0; i < FFT_SIZE; i++) {
> fftBuffer[i].real = FilterOut[i];
> fftBuffer[i].imag = 0;
> }
>
> FFTComplexIP(LOG2N, fftBuffer, twiddleFactors, COEFFS_IN_DATA);
> BitReverseComplex(LOG2N, fftBuffer );
> SquareMagnitudeCplx( FFT_SIZE , fftBuffer, powerspec);
>
>
> 以上のようなプログラミングを組みました。変数bufferとpowerspecをdsPICworksを用いてFFTの結果を確認しています。fftbufferまではうまくいくのですが、パワースペクトルであるpowerspecがうまくいかず、値がすべて0になってしまいます。引数が間違っているのでしょうか。
>
> 是非ご教授ください。
> よろしくお願いいたします。
>

Re^2: dsPICを使ったFFT関数 投稿者:su- 投稿日:2018/08/21(Tue) 15:44:18 No.1198

ご返事ありがとうございます。
パラメータを変更しFFT_SIZE/2にしましたがうまくいきませんでした。
microchip社のサンプルコードをそのまま試したところ、パワースペクトラムを得ることができましたが、ADC Interruptを加えるとうまくいかなくなります。
BitReverseComplex(LOG2N, fftBuffer )まではうまくいき、dsPICworksでFFTの結果は見れるのですが、SquareMagnitudeCplx( FFT_SIZE , fftBuffer, powerspec)を入れるとpowerspecの値がすべて0になります。



>多分、SquareMagnitudeCplx関数の最初のパラメータが間違って
> いるのだと思います。 FFT_SIZE/2 にする必要があります。

Re^3: dsPICを使ったFFT関数 投稿者:su- 投稿日:2018/08/22(Wed) 16:54:38 No.1199

解決しました。
お手数ありがとうございます。
入力信号が小さかっただけのようです。データに倍率をかけたとこと無事スペクトルが出ました。

> ご返事ありがとうございます。
> パラメータを変更しFFT_SIZE/2にしましたがうまくいきませんでした。
> microchip社のサンプルコードをそのまま試したところ、パワースペクトラムを得ることができましたが、ADC Interruptを加えるとうまくいかなくなります。
> BitReverseComplex(LOG2N, fftBuffer )まではうまくいき、dsPICworksでFFTの結果は見れるのですが、SquareMagnitudeCplx( FFT_SIZE , fftBuffer, powerspec)を入れるとpowerspecの値がすべて0になります。
>
>
>
> >多分、SquareMagnitudeCplx関数の最初のパラメータが間違って
> > いるのだと思います。 FFT_SIZE/2 にする必要があります。
>

- WebForum -