Làm thế nào để tạo tín hiệu liên hợp đối xứng?


8

Thực hiện thao tác lọc băng thông miền tần số đơn giản dưới đây. . .

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

Điều này mang lại một đầu ra thực sự bởi vì tôi đang sử dụng cờ đối xứng liên hợp cho hoạt động ifft.

Tôi muốn một hàm trả về phiên bản đối xứng liên hợp của H, vì vậy tôi không phải dựa vào tùy chọn đối xứng dựng sẵn trong ifft của Matlab. NFFT có thể là bất kỳ số nguyên dương. Điều này có thể được gọi là một cái gì đó như thế này. .

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

Câu hỏi: Có thể khái quát hóa điều này thành 3D không? tức là nếu X là 3 chiều
Emmanuel

Câu trả lời:


10

Liên hợp phương tiện đối xứng

f(-x)= =f*(x)

tức là dấu hiệu của phần tưởng tượng ngược lại khi x<0

FFT của tín hiệu thực là đối xứng liên hợp. Một nửa phổ là tần số dương và nửa còn lại là âm. Các hệ số âm là liên hợp của dương.

Vì vậy, nếu bạn thực hiện lọc, đường bao của bạn phải thực hiện cả tần số dương và tần số âm tương ứng của chúng, để các bit tưởng tượng bị hủy bỏ.

Trong ví dụ của bạn, H chỉ làm một nửa. Đó là lý do tại sao đầu ra có bit tưởng tượng trong đó. Những gì bạn muốn là

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

Bạn chỉ cần chắc chắn rằng

Hk= =HN-k*,k= =1,2,Giáo dụcN-1,(NGiáo dụcĐộ dài FFT)

và đó H0 là giá trị thực.


0

Sử dụng các câu trả lời khác Tôi có một hàm MATLAB được viết để thực hiện những gì bạn cần:

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

Như đã lưu ý trong mã, MATLAB Coder không hỗ trợ IFFT đối xứng nên cần có chức năng mã hóa chuyên dụng để thực hiện việc này nếu việc biên dịch mã là mục tiêu. Mã được cung cấp phải hỗ trợ cả FFT chiều dài chẵn và lẻ.

Các định dạng trông hơi tốt hơn trên ý chính .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.