/************************************************************
周波数領域信号処理サンプルプログラム
FFT→逆FFT
************************************************************/
#include "iolib.h"
#include <trans.h>
/* FFT点数 */
#define FFTLEN 256
/* FFTと逆FFT */
#define fft rfft256
#define ifft ifft256
/**** 入出力バッファ ****/
/* 入出力用と信号処理用の2組 */
float inbuf[2][FFTLEN]; /* 入力バッファ */
float outbuf[2][FFTLEN]; /* 出力バッファ */
int buf_io = 0; /* 入出力に使うバッファ */
int buf_proc = 0; /* 信号処理に使うバッファ */
int buf_full = 0; /* バッファに信号が溜ったら1 */
int count = 0; /* 入出力用のカウンタ */
/**** FFT用の配列 ****/
float in_r[FFTLEN], in_i[FFTLEN]; /* 周波数領域の入力 */
float out_r[FFTLEN], out_i[FFTLEN]; /* 周波数領域の出力 */
float out_t[FFTLEN]; /* 時間領域の出力虚数部 */
/**** 割り込み処理 ****/
/* 入力信号があれば割り込みがかかり、実行される */
/* rx_buf[1]とrx_buf[2]が入力信号 */
/* tx_buf[1]とtx_buf[2]が出力信号 */
void process_input(int irq)
{
/* 入力信号をバッファに格納 */
inbuf[buf_io][count] = rx_buf[1];
/* バッファから出力信号を取り出す */
tx_buf[1] = tx_buf[2] = outbuf[buf_io][count];
/* バッファがいっぱいになったかどうか調べる */
count++;
if (count == FFTLEN) {
buf_full = 1;
buf_io = 1 - buf_io;
count = 0;
}
}
void main(void)
{
/* スケーリング (FFT点数で割らないといけない) */
float scale = (1.0 / FFTLEN);
int i;
/* 出力バッファを初期化 */
for (i = 0; i < FFTLEN; i++) {
outbuf[0][i] = 0.0;
outbuf[1][i] = 0.0;
}
/* DSPとA/D, D/Aの初期化 */
init_21k();
init_1847(SAMPLE8000, 0);
/* メイン: 無限ループ */
for(;;) {
/* 入力信号が溜るまで待つ */
while (!buf_full)
idle();
buf_full = 0;
/* FFTで周波数領域に */
fft(inbuf[buf_proc], in_r, in_i);
/* 単に入力を出力にコピー */
/* スケーリングを忘れずに */
for (i = 0; i < FFTLEN; i++) {
out_r[i] = scale * in_r[i];
out_i[i] = scale * in_i[i];
}
/* 逆FFTで時間領域に */
ifft(out_r, out_i, outbuf[buf_proc], out_t);
/* バッファの切り替え */
buf_proc = 1 - buf_proc;
}
}