Prenez la simple opération de filtrage passe-bande dans le domaine fréquentiel ci-dessous. . .
NFFT = 128;
x = randn(NFFT,1);
H = zeros(NFFT,1);
H(10:20) = 1;
y = ifft(H.*fft(x), 'symmetric');
Cela donne une sortie réelle car j'utilise le drapeau symétrique conjugué pour l'opération ifft.
Je veux une fonction qui renvoie la version symétrique conjuguée de H, donc je n'ai pas à me fier à l'option symétrique intégrée dans ifft de Matlab. NFFT peut être n'importe quel entier positif. Cela pourrait s'appeler quelque chose comme ça. .
H(10:20) = 1;
H = MakeConjSym(H);
Réponses:
Conjuguer des moyens symétriques
c'est-à-dire que le signe de la partie imaginaire est opposé lorsquex < 0
La FFT d'un signal réel est conjuguée symétrique. Une moitié du spectre est constituée des fréquences positives et l'autre moitié est négative. Les coefficients négatifs sont conjugués du positif.
Donc, si vous effectuez un filtrage, votre enveloppe doit faire à la fois les fréquences positives et leurs fréquences négatives correspondantes, afin que les bits imaginaires s'annulent.
Dans votre exemple, H ne fait qu'une moitié. C'est pourquoi la sortie contient des bits imaginaires. Ce que tu veux c'est
la source
Vous devez juste vous assurer que
et que une valeur réelle.H0
la source
En utilisant les autres réponses, j'ai écrit une fonction MATLAB pour effectuer ce dont vous aviez besoin:
Comme indiqué dans le code, MATLAB Coder ne prend pas en charge un IFFT symétrique, donc une fonction dédiée et codée en dur est nécessaire pour ce faire si la compilation de code est l'objectif. Le code fourni doit prendre en charge les FFT de longueur paire et impaire.
La mise en forme semble légèrement meilleure sur l'essentiel .
la source