3

グラフィックイコライザーFIRフィルターの係数を計算するためのアプリケーションを作成しようとしています。Matlabでプロトタイピングを行っていますが、問題があります。

私は次のMatlabコードから始めました:

    % binamps vector holds 2^13 = 8192 bins of desired amplitude values for frequencies in range 0.001 .. 22050 Hz (half of samplerate 44100 Hz)
    % it looks just fine, when I use Matlab plot() function 
    % now I get ifft
    n = size(binamps,1);
    iff = ifft(binamps, n);
    coeffs = real(iff); % throw away the imaginary part, because FIR module will not use it anyway  

しかし、係数のfft()を実行すると、周波数が2倍に引き伸ばされ、AFRデータの終わりが失われることがわかります。

p = fft(coeffs, n); % take the fourier transform of coefficients for a test

nUniquePts = ceil((n+1)/2); 
p = p(1:nUniquePts); % select just the first half since the second half 
                       % is a mirror image of the first
p = abs(p); % take the absolute value, or the magnitude 
p = p/n; % scale by the number of points so that
           % the magnitude does not depend on the length 
           % of the signal or on its sampling frequency  
p = p.^2;  % square it to get the power 

sampFreq = 44100;
freqArray = (0:nUniquePts-1) * (sampFreq / n); % create the frequency array 
semilogx(freqArray, 10*log10(p)) 
axis([10, 30000 -Inf Inf])
xlabel('Frequency (Hz)') 
ylabel('Power (dB)') 

だから、私はifftを間違って使用していると思います。binampsベクトルを2倍の長さにし、その2番目の部分にミラーを作成する必要がありますか?その場合、Matlabのifftの実装だけですか、それとも他のC / C ++ FFTライブラリ(特にOoura FFT)が逆FFTのミラーリングされたデータを必要としますか?

FIR係数をifftから取得するために知っておくべきことは他にありますか?

4

2 に答える 2

3

周波数領域ベクトルは、単なる実数ではなく複雑である必要があり、純粋にリアルタイムの領域信号を取得するには、中点に関して対称である必要があります。実数部を希望の大きさの値に設定し、虚数部をゼロに設定します。実際の部品は、次のような対称性を持っている必要がありますA[N - i] = A[i]( DCA[0]およびA[N / 2]ナイキストコンポーネントである「特別な」-これらをゼロに設定するだけです)。

上記は、MATLABの実装だけでなく、あらゆる汎用の複合体から複合体へのFFT/IFFTに適用されます。

任意の周波数応答を持つ時間領域フィルターを設計しようとしている場合は、最初に周波数領域でウィンドウ処理を行う必要があることに注意してください。この記事は役立つかもしれません-MATLAB、特にfir2を使用した任意のFIRフィルター設計について説明しています。

于 2011-10-18T17:37:43.587 に答える
2

実際の結果を得るには、(Matlabの実装だけでなく)一般的な汎用IFFTへの入力が複素共役対称である必要があります。したがって、特定の数の独立した仕様ポイントでIFFTを実行するには、少なくとも2倍の長さのFFTが必要になります(最高周波数のカットオフからゼロへの遷移を可能にするために、さらに長くすることが望ましい)。

複雑な結果の「架空の」部分を破棄して実際の結果を取得しようとしても、IFFTへの特定の周波数応答入力に時間領域フィルターが必要とする実際に必要な情報コンテンツを破棄するため、機能しません。ただし、元のデータが共役対称である場合、IFFT / FFT結果の虚数部は、(通常は重要ではない)丸め誤差ノイズになり、破棄される可能性があります。

また、有限周波数応答のDTFTは、無限に長いFIRを生成します。有限長のFIRを取得するには、周波数応答仕様の仕様を妥協して、実現可能または有限にするためにFIRから切り捨てる必要のある時間領域表現の後半部分にエネルギーがほとんど残っていないようにする必要があります。 。これを行う一般的な(ただし、必ずしも最善ではない)方法の1つは、IFFTによって生成されたFIR結果をウィンドウ処理し、試行錯誤によって、FFTが結果を生成するFIRフィルターが見つかるまでさまざまなウィンドウを試すことです。元の周波数仕様に十分に近い」。

于 2011-10-18T19:01:56.457 に答える