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);
Respuestas:
Conjugación simétrica
es decir, el signo de la parte imaginaria es opuesto cuandox < 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
fuente
Solo tienes que asegurarte de que
y esoH0 0 tiene un valor real
fuente
Usando las otras respuestas, he escrito una función MATLAB para realizar lo que necesita:
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 .
fuente