如何使信号共轭对称?

信息处理 fft IFFT 共轭 对称
2022-01-13 18:37:30

采取下面的简单频域带通滤波操作。. .

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);
3个回答

共轭对称均值

f(x)=f(x)

时虚部符号相反x<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));

你只需要确保

Hk=HNk,k=1,2,N1,(NFFT length)

并且是实值的。H0

使用其他答案,我编写了一个 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。

格式在要点上看起来稍微好一些