Bagaimana cara membuat sinyal konjugat simetris?

8

Ambil operasi penyaringan band-pass frekuensi-domain sederhana di bawah ini. . .

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

Ini memberikan output nyata karena saya menggunakan flag simetris konjugat untuk operasi ifft.

Saya ingin fungsi yang mengembalikan versi simetris konjugat H, jadi saya tidak harus bergantung pada opsi simetris bawaan dalam ifl Matlab. NFFT dapat berupa bilangan bulat positif. Ini bisa disebut sesuatu seperti ini. .

H(10:20) = 1;
H = MakeConjSym(H);
belajar
sumber
Pertanyaan: Apakah mungkin untuk menggeneralisasi ini menjadi 3D? yaitu jika X adalah 3 dimensi
Emmanuel

Jawaban:

10

Konjugasi berarti simetris

f(-x)=f(x)

yaitu tanda bagian imajiner berlawanan ketika x<0

FFT dari sinyal nyata adalah konjugat simetris. Separuh spektrum adalah frekuensi positif, dan separuh lainnya adalah negatif. Koefisien negatif adalah konjugat dari positif.

Jadi jika Anda melakukan pemfilteran, amplop Anda harus melakukan frekuensi positif dan frekuensi negatif yang sesuai, sehingga bit imajiner dibatalkan.

Dalam contoh Anda, H hanya melakukan setengah. Itulah sebabnya output memiliki bit imajiner di dalamnya. Yang Anda inginkan adalah

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

Anda hanya harus memastikan itu

Hk=HN-k,k=1,2,...N-1,(N...Panjang FFT)

dan itu H0 bernilai nyata.

Matt L.
sumber
0

Menggunakan jawaban lain saya punya fungsi MATLAB tertulis untuk melakukan apa yang Anda butuhkan:

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

Seperti disebutkan dalam kode, MATLAB Coder tidak mendukung IFFT simetris sehingga diperlukan fungsi khusus yang dikodekan untuk melakukan ini jika kompilasi kode adalah tujuannya. Kode yang disediakan harus mendukung FFT panjang genap dan ganjil.

Format terlihat sedikit lebih baik pada intinya .

pengeras suara
sumber