信号を共役対称にする方法は?


8

以下の簡単な周波数領域バンドパスフィルタリング操作を考えてみましょう。。。

NFFT = 128;
x = randn(NFFT,1);
H = zeros(NFFT,1);
H(10:20) = 1;
y = ifft(H.*fft(x), 'symmetric');

ifft演算に共役対称フラグを使用しているため、これにより実際の出力が得られます。

Hの共役対称バージョンを返す関数が必要なので、Matlabのifftの組み込みの対称オプションに依存する必要はありません。NFFTには任意の正の整数を指定できます。これはこのようなものと呼ぶことができます。。

H(10:20) = 1;
H = MakeConjSym(H);

質問:これを3Dに一般化することは可能ですか?つまり、Xが3次元の場合
Emmanuel

回答:


10

共役対称平均

fバツ=fバツ

つまり、虚数部の符号が反対の場合 バツ<0

実信号のFFTは共役対称です。スペクトルの半分は正の周波数で、残りの半分は負の周波数です。負の係数は正の共役です。

したがって、フィルタリングを行う場合、虚数ビットが相殺されるように、エンベロープは正の周波数と対応する負の周波数の両方を行う必要があります。

あなたの例では、Hは半分しか行いません。これが、出力に虚数ビットがある理由です。あなたが欲しいのは

NFFT = 128;
x = randn(NFFT,1);
H = zeros(NFFT,1);
H(10:20) = 1;
H(end-20+2:end-10+2) = 1;    % Other half
y = ifft(H.*fft(x));

6

あなたはそれを確認する必要があります

Hk=HNkk=12N1NFFT長

そしてそれ H0 実数値です。


0

他の答えを使用して、必要なことを実行するためのMATLAB関数を作成しました。

function X = forceFFTSymmetry(X)
% forceFFTSymmetry  A function to force conjugate symmetry on an FFT such that when an
% IFFT is performed the result is a real signal.

% The function has been written to replace MATLAB's ifft(X,'symmetric'), as this function
% is not compatible with MATLAB Coder.

% Licensed under Creative Commons Zero (CC0) so use freely.

XStartFlipped = fliplr(X(2:floor(end/2)));
X(ceil(end/2)+2:end) = real(XStartFlipped) - sqrt(complex(-1))*imag(XStartFlipped);

% Or
% X(ceil(end/2)+2:end) = conj(XStartFlipped);

end

コードに記載されているように、MATLAB Coderは対称IFFTをサポートしていないため、コードコンパイルが目的の場合、これを行うには専用のハードコードされた関数が必要です。提供されるコードは、偶数と奇数の両方のFFTをサポートする必要があります。

書式設定は要点で少し良く見えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.