Wie macht man ein Signal konjugiert symmetrisch?

8

Nehmen Sie die unten stehende einfache Frequenzbereich-Bandpassfilteroperation. . .

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

Dies ergibt eine echte Ausgabe, da ich das konjugierte symmetrische Flag für die ifft-Operation verwende.

Ich möchte eine Funktion, die die konjugierte symmetrische Version von H zurückgibt, daher muss ich mich nicht auf die integrierte symmetrische Option in Matlabs ifft verlassen. NFFT kann eine beliebige positive ganze Zahl sein. Dies könnte man so etwas nennen. .

H(10:20) = 1;
H = MakeConjSym(H);
lernen
quelle
Frage: Ist es möglich, dies auf 3D zu verallgemeinern? dh wenn X dreidimensional ist
Emmanuel

Antworten:

10

Symmetrische Mittel konjugieren

f(- -x)=f(x)

dh das Vorzeichen des Imaginärteils ist entgegengesetzt, wennx<0

Die FFT eines realen Signals ist konjugiert symmetrisch. Eine Hälfte des Spektrums sind die positiven Frequenzen und die andere Hälfte sind die negativen. Die negativen Koeffizienten sind konjugiert mit den positiven.

Wenn Sie also filtern, muss Ihre Hüllkurve sowohl die positiven als auch die entsprechenden negativen Frequenzen ausführen, damit sich die imaginären Bits aufheben.

In Ihrem Beispiel macht H nur die Hälfte. Deshalb enthält der Ausgang imaginäre Bits. Was du willst ist

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));
geometrisch
quelle
6

Sie müssen nur sicherstellen, dass

H.k=H.N.- -k,k=1,2,N.- -1,(N.FFT-Länge)

H.0

Matt L.
quelle
0

Mit den anderen Antworten habe ich eine MATLAB-Funktion geschrieben, um das auszuführen, was Sie benötigen:

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

Wie im Code erwähnt, unterstützt MATLAB Coder keine symmetrische IFFT, sodass eine dedizierte, fest codierte Funktion erforderlich ist, wenn die Codekompilierung das Ziel ist. Der bereitgestellte Code sollte sowohl FFTs mit gerader als auch mit ungerader Länge unterstützen.

Die Formatierung sieht im Kern etwas besser aus .

laute Geräusche
quelle