1

320 個のサンプルを含むパケットで PCM データをソケット接続経由で受信しています。サウンドのサンプル レートは 1 秒あたり 8000 サンプルです。私はそれで次のようなことをしています:

int size = 160 * 2;//160;
int isinverse = 1;
kiss_fft_scalar zero;
memset(&zero,0,sizeof(zero));
kiss_fft_cpx fft_in[size];
kiss_fft_cpx fft_out[size];
kiss_fft_cpx fft_reconstructed[size];

kiss_fftr_cfg fft = kiss_fftr_alloc(size*2 ,0 ,0,0);
kiss_fftr_cfg ifft = kiss_fftr_alloc(size*2,isinverse,0,0);

for (int i = 0; i < size; i++) {
    fft_in[i].r = zero;
    fft_in[i].i = zero;
    fft_out[i].r = zero;
    fft_out[i].i = zero;
    fft_reconstructed[i].r = zero;
    fft_reconstructed[i].i = zero;
}

// got my data through socket connection

for (int i = 0; i < size; i++) {
     // samples are type of short
     fft_in[i].r = samples[i];
     fft_in[i].i = zero;
     fft_out[i].r = zero;
     fft_out[i].i = zero;
 }

 kiss_fftr(fft, (kiss_fft_scalar*) fft_in, fft_out);
 kiss_fftri(ifft, fft_out, (kiss_fft_scalar*)fft_reconstructed);

 // lets normalize samples
 for (int i = 0; i < size; i++) {
     short* samples = (short*) bufTmp1;
     samples[i] = rint(fft_reconstructed[i].r/(size*2));
 }

その後、OpenAL バッファを埋めて再生します。kiss_fftrすべて正常に動作しますが、との間でオーディオのフィルタリングを行いたいと思いますkiss_fftri。これの出発点は、音を時間領域から周波数領域に変換することですが、関数からどのような種類のデータを受け取っているのかよくわかりませんkiss_fftr。これらの複素数のそれぞれにどのような情報が格納されているか、その実数部と虚数部が周波数について教えてくれるもの. fft_outそして、どの周波数がカバーされているか(どの周波数スパンが)、どのインデックスがどの周波数に対応しているかはわかりません。

私は信号処理とフーリエ変換のトピックの初心者です。

何か助けはありますか?

4

3 に答える 3

2

両足で C 実装に飛び込む前に、デジタル フィルター、特にFIR フィルターに慣れてください。

GNU Octave のシグナル ツールボックスのようなものを使用して、FIR フィルターを設計できます。コマンド fir1 (最も単純な)、firls、または remez を見てください。または、Web ページから FIR フィルターを設計できる場合もあります。「online fir filter design」を Web ですばやく検索すると、これが見つかりまし(使用したことはありませんが、remez または firpm コマンドで使用される等リップル設計を使用しているようです)。

最初にフィルターを直接畳み込み (FFT なし) で実装してみて、速度が許容できるかどうかを確認してください。これはより簡単な方法です。FFT ベースのアプローチが必要な場合は、kissfft/tools/kiss_fastfir.c ファイルにオーバーラップ保存のサンプル実装があります。

于 2012-06-06T12:47:03.660 に答える
1

調査したいのは、オーバーラップ追加またはオーバーラップ保存アルゴリズムを使用した FFT 高速畳み込みです。目的のフィルターのインパルスの長さだけ、各 FFT の長さを拡張する必要があります。これは、(1) FFT/IFFT 畳み込みが循環的であり、(2) FFT 配列結果の各インデックスが 1 つだけではなく (ほぼ 1 に近い場合でも) ほぼすべての周波数 (Sinc 整形応答) に対応するためです。ビンの変更は、周波数応答全体で漏れます (特定の正確な周期周波数を除く)。

于 2012-06-05T15:23:02.867 に答える