Come rendere simmetrico un segnale coniugato?


8

Effettuare la semplice operazione di filtro passa-banda nel dominio della frequenza di seguito. . .

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

Questo dà un vero risultato perché sto usando il flag simmetrico coniugato per l'operazione ifft.

Voglio una funzione che ritorni la versione simmetrica coniugata di H, quindi non devo fare affidamento sull'opzione simmetrica incorporata nell' ifft di Matlab. NFFT può essere qualsiasi numero intero positivo. Questo potrebbe essere chiamato qualcosa del genere. .

H(10:20) = 1;
H = MakeConjSym(H);

Domanda: è possibile generalizzare questo in 3D? cioè se X è tridimensionale
Emmanuel,

Risposte:


10

Coniugare mezzi simmetrici

f(-X)=f*(X)

cioè il segno della parte immaginaria è opposto quando X<0

La FFT di un segnale reale è coniugata simmetrica. Una metà dello spettro è rappresentata dalle frequenze positive e l'altra metà è negativa. I coefficienti negativi sono coniugati del positivo.

Quindi, se si esegue il filtraggio, l'inviluppo deve eseguire sia le frequenze positive sia le corrispondenti frequenze negative, in modo che i bit immaginari si annullino.

Nel tuo esempio, H fa solo la metà. Ecco perché l'output contiene bit immaginari. Quello che vuoi è

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));

6

Devi solo assicurartelo

HK=HN-K*,K=1,2,...N-1,(N...Lunghezza FFT)

e quello H0 è valorizzato.


0

Usando le altre risposte ho scritto una funzione MATLAB per eseguire ciò che hai richiesto:

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

Come indicato nel codice, MATLAB Coder non supporta un IFFT simmetrico, quindi una funzione dedicata e codificata è necessaria per farlo se l'obiettivo è la compilazione del codice. Il codice fornito dovrebbe supportare FFT sia di lunghezza pari che dispari.

La formattazione sembra leggermente migliore in sostanza .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.