¿Cómo hacer una señal conjugada simétrica?

8

Tome la operación de filtrado de paso de banda de dominio de frecuencia simple a continuación. . .

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

Esto da una salida real porque estoy usando la bandera simétrica conjugada para la operación ifft.

Quiero una función que devuelva la versión simétrica conjugada de H, por lo que no tengo que confiar en la opción simétrica incorporada en el ifft de Matlab. NFFT puede ser cualquier número entero positivo. Esto podría llamarse algo así. .

H(10:20) = 1;
H = MakeConjSym(H);
aprender
fuente
Pregunta: ¿Es posible generalizar esto a 3D? es decir, si X es tridimensional
Emmanuel

Respuestas:

10

Conjugación simétrica

F(-X)=F(X)

es decir, el signo de la parte imaginaria es opuesto cuando X<0 0

La FFT de una señal real es conjugada simétrica. La mitad del espectro son las frecuencias positivas, y la otra mitad es la negativa. Los coeficientes negativos son conjugados de lo positivo.

Entonces, si realiza el filtrado, su envolvente debe hacer tanto las frecuencias positivas como sus frecuencias negativas correspondientes, de modo que los bits imaginarios se cancelen.

En su ejemplo, H solo hace la mitad. Es por eso que la salida tiene bits imaginarios. Lo que quieres es

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
fuente
6

Solo tienes que asegurarte de que

Hk=Hnorte-k,k=1,2,...norte-1,(norte...Longitud FFT)

y eso H0 0 tiene un valor real

Matt L.
fuente
0

Usando las otras respuestas, he escrito una función MATLAB para realizar lo que necesita:

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

Como se señala en el código, MATLAB Coder no admite un IFFT simétrico, por lo que se requiere una función dedicada y codificada para hacerlo si el objetivo es la compilación de código. El código proporcionado debe admitir FFT de longitud par e impar.

El formato se ve un poco mejor en la esencia .

ruidos fuertes
fuente