Como fazer um sinal conjugado simétrico?

8

Veja a operação simples de filtragem de passagem de banda no domínio da frequência abaixo. . .

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

Isso fornece uma saída real, porque eu estou usando o sinalizador simétrico conjugado para a operação ifft.

Eu quero uma função que retorne a versão simétrica conjugada de H, portanto não preciso confiar na opção simétrica integrada no ifft do Matlab. NFFT pode ser qualquer número inteiro positivo. Isso poderia ser chamado de algo assim. .

H(10:20) = 1;
H = MakeConjSym(H);
learnvst
fonte
Pergunta: É possível generalizar isso para 3D? ou seja, se X é tridimensional
Emmanuel

Respostas:

10

Meios simétricos conjugados

f(-x)=f(x)

ou seja, o sinal da parte imaginária é oposto quando x<0 0

A FFT de um sinal real é conjugada simétrica. Metade do espectro é de frequências positivas e a outra metade é negativa. Os coeficientes negativos são conjugados do positivo.

Portanto, se você filtrar, seu envelope deverá realizar as frequências positivas e as correspondentes negativas, para que os bits imaginários sejam cancelados.

No seu exemplo, H faz apenas metade. É por isso que a saída contém bits imaginários. O que você quer é

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));
geometrikal
fonte
6

Você só precisa se certificar de que

Hk=HN-k,k=1,2,N-1,(NComprimento FFT)

e essa H0 0 é com valor real.

Matt L.
fonte
0

Usando as outras respostas, escrevi uma função MATLAB para executar o que você precisava:

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

Conforme observado no código, o MATLAB Coder não suporta um IFFT simétrico, portanto uma função dedicada e codificada é necessária para fazer isso se a compilação de código for o objetivo. O código fornecido deve suportar FFTs de comprimento par e ímpar.

A formatação parece um pouco melhor na essência .

barulhos altos
fonte