Comment rendre symétrique un conjugué de signaux?

8

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);
learnvst
la source
Question: Est-il possible de généraliser cela à la 3D? c'est-à-dire si X est tridimensionnel
Emmanuel

Réponses:

10

Conjuguer des moyens symétriques

f(x)=f(x)

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

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
la source
6

Vous devez juste vous assurer que

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

et que une valeur réelle.H0

Matt L.
la source
0

En utilisant les autres réponses, j'ai écrit une fonction MATLAB pour effectuer ce dont vous aviez besoin:

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

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 .

bruits forts
la source