Tại sao nó là một ý tưởng tồi để lọc bằng cách loại bỏ các thùng FFT?


72

Thật dễ dàng để lọc tín hiệu bằng cách thực hiện FFT trên tín hiệu đó, loại bỏ một số thùng và sau đó thực hiện IFFT. Ví dụ:

t = linspace(0, 1, 256, endpoint=False)
x = sin(2 * pi * 3 * t) + cos(2 * pi * 100 * t)
X = fft(x)
X[64:192] = 0
y = ifft(X)

Thành phần tần số cao được loại bỏ hoàn toàn bởi bộ lọc FFT "brickwall" này.

Nhưng tôi đã nghe nói đây không phải là một phương pháp tốt để sử dụng.

  • Tại sao nói chung nó là một ý tưởng tồi?
  • Có hoàn cảnh nào trong đó là một lựa chọn tốt hay tốt không?

[ như được đề xuất bởi pichenettes ]

Câu trả lời:


74

Các thùng không trong miền tần số giống như nhân với một cửa sổ hình chữ nhật trong miền tần số. Nhân với một cửa sổ trong miền tần số giống như tích chập tròn bằng phép biến đổi của cửa sổ đó trong miền thời gian. Biến đổi của một cửa sổ hình chữ nhật là hàm Sinc ( ). Lưu ý rằng hàm Sinc có nhiều gợn sóng lớn và gợn sóng mở rộng toàn bộ khẩu độ miền thời gian. Nếu một bộ lọc miền thời gian có thể xuất ra tất cả các gợn sóng đó (đổ chuông) là một "ý tưởng tồi", thì thùng rác cũng vậy.sin(ωt)/ωt

Những gợn sóng này sẽ lớn nhất đối với bất kỳ nội dung phổ nào là "giữa các thùng" hoặc không phải là số nguyên định kỳ theo chiều rộng khẩu độ FFT. Vì vậy, nếu dữ liệu đầu vào FFT ban đầu của bạn là một cửa sổ trên bất kỳ dữ liệu nào có phần không định kỳ trong cửa sổ đó (ví dụ: hầu hết các tín hiệu "thế giới thực" được lấy mẫu không đồng bộ), thì các tạo phẩm cụ thể đó sẽ được tạo ra bởi các thùng không.

Một cách khác để xem xét đó là mỗi thùng kết quả FFT đại diện cho một tần số sóng hình sin nhất định trong miền thời gian. Do đó, việc tạo ra một thùng sẽ tạo ra kết quả tương tự như trừ đi sóng hình sin đó, hoặc, tương đương, thêm một sóng hình sin có tần số trung tâm của thùng FFT chính xác nhưng với pha ngược lại. Lưu ý rằng nếu tần số của một số nội dung trong miền thời gian không hoàn toàn là số nguyên định kỳ theo chiều rộng FFT, thì hãy cố gắng hủy nó bằng cách thêm nghịch đảo của sóng hình sin định kỳ chính xác sẽ tạo ra, không phải là im lặng, mà là một thứ gì đó trông giống một ghi chú "nhịp" (sóng hình sin điều biến AM có tần số khác nhau). Một lần nữa, có lẽ không phải là những gì muốn.

Ngược lại, nếu tín hiệu miền thời gian ban đầu của bạn chỉ là một vài hình sin không được điều chế thuần túy là số nguyên chính xác theo chiều rộng khẩu độ FFT, thì các thùng FFT bằng 0 sẽ loại bỏ các thùng được chỉ định mà không có tạo tác.


3
Câu trả lời này có nội dung hay, nhưng tôi thích tập trung hơn vào hiệu ứng Gibbs.
Jim Clay

4
Một nỗ lực để có câu trả lời cho hiệu ứng Gibbs đã được hỏi ở đây: dsp.stackexchange.com/questions/1144/ chủ
hotpaw2

@ hotpaw2 Đây là một lời giải thích tốt. Tuy nhiên, tôi cần một tài liệu tham khảo về điều này và đang gặp một số khó khăn trong việc xác định một. Đó là lý do chúng tôi thực hiện lọc miền thời gian chứ không phải làm việc trong miền tần số. (Ngoài ra, miền thời gian có thể là thời gian thực.) Tuy nhiên, dường như không ai bắt đầu bằng cách nêu điều này!
Hugh

Làm thế nào điều này có thể liên quan đến phương pháp cửa sổ cho thiết kế bộ lọc?
Filipe Pinto

So sánh sự biến đổi của cửa sổ Von Hann (et.al.) với cửa sổ hình chữ nhật bất kỳ. Nói chung, đáp ứng bộ lọc tốt hơn nhiều, đặc biệt là giữa các thùng FFT trong dải dừng. Nói chung, các thùng zeroing đột ngột tồi tệ hơn so với không zeroing gần các chuyển đổi.
hotpaw2

3

Câu hỏi này cũng đã làm tôi bối rối trong một thời gian dài. @ hotpaw2 giải thích là tốt. Bạn có thể quan tâm đến thí nghiệm đơn giản sử dụng MATLAB.

https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html


thông tin cập nhật.

Để xác minh thực tế này là đơn giản, chúng ta chỉ cần thận trọng quan sát phổ phản ứng xung của bộ lọc thông dải lý tưởng (?) Mà chỉ cần loại bỏ các thùng FFT. Tại sao tôi cần thêm trạng từ "thận trọng"? Nếu chúng ta chỉ sử dụng cùng kích thước của FFT để quan sát phản ứng của xung, chúng ta sẽ bị đánh lừa như trong Hình 1 . Tuy nhiên, nếu chúng ta thêm thứ tự DFT khi quan sát đầu ra của bộ lọc, nghĩa là, không đệm cho đáp ứng xung, chúng ta có thể tìm thấy hiện tượng được gọi là hiện tượng Gibbs, gợn sóng trong miền tần số, như được mô tả trong Hình 2 .

Các kết quả trong thực tế đến từ hiệu ứng cửa sổ. Nếu bạn muốn hiểu hoàn toàn vấn đề, vui lòng tham khảo chương 7.6 và chương 10.1-10.2 của kinh thánh DSP (1). Tóm lại, ba điểm chính được ghi chú ở đây.

  1. Kích thước của cửa sổ và thứ tự của DFT (FFT) là hoàn toàn độc lập. Đừng trộn chúng lại với nhau.
  2. Thuộc tính của cửa sổ (loại / kích thước) chi phối hình dạng của DTFT. (ví dụ: thùy chính rộng hơn dẫn đến dải thoáng qua rộng hơn trong đáp ứng tần số.)
  3. DFT chỉ là mẫu của DTFT trong miền tần số. Hơn nữa, thứ tự DFT càng cao, phổ của DFT càng dày.

Vì vậy, với sự trợ giúp của phổ dày đặc hơn trong Hình 2 , chúng ta có thể nhìn xuyên qua mặt nạ của bộ lọc Băng thông lý tưởng (giả).

nhập mô tả hình ảnh ở đâyFreq lừa dối. Phản ứng.

nhập mô tả hình ảnh ở đâyHiện tượng Gibbs ở Freq. Phản ứng.

(1) Alan V. Oppenheim và Ronald W. Schafer. 2009. Xử lý tín hiệu thời gian rời rạc (tái bản lần 3). Nhà xuất bản Prentice Hall, Thượng Yên River, NJ, Hoa Kỳ.

fps = 15;

LPF = 1;
HPF = 2;

n = -511:512;
n0 = 0;
imp = (n==n0);

NyquistF = 1/2*fps;

%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);  
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];

% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];

N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');


N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');

%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)

    N = length(input_signal);
    n = 0:1:N-1;
    freq = ( n .* fs) ./ N;

    filered_signal = zeros(N, 1);

    for i = 1:N
        if freq(i) > w1 & freq(i) < w2
            filered_signal(i) = input_signal(i);
        end

    end
end

Điều này có thể được chuyển đổi thành một bình luận?
endolith

Xin lỗi tôi không có đủ danh tiếng. Giải thích trong URL cũng được viết bởi chính tôi. Tôi chỉ muốn cung cấp một mã kiểm tra có thể hình dung được ảnh hưởng xấu của Ripple.
Po-wei Huang

1

FFT cho độ phân giải thời gian kém tức là nó không cung cấp thông tin tại thời điểm tần số cụ thể đó tồn tại. Nó cung cấp thông tin về các thành phần tần số hiện tại trong thời gian tín hiệu nhất định.

Bằng cách bỏ các thùng trong FFT cho độ phân giải kém sau IFFT trong miền thời gian.


tuy nhiên có những khó khăn tính toán cho tín hiệu rất dài để lấy fft và sau đó là ifft. Để tránh quá trình lọc / rung chuông của tín hiệu phải được chuyển trơn tru từ dải thông sang dải dừng.
Itta Gouthami

"FFT cho độ phân giải thời gian kém" FFT không phân giải thời gian, đó là biến đổi miền phổ và do đó, như đã nói sau đó, chỉ cung cấp thông tin về các thành phần tần số của tín hiệu.
EdParadox

Độ phân giải được cung cấp bởi FFT là độ dài của cửa sổ. Bất cứ điều gì bên ngoài cửa sổ của FFT không được giải quyết như ở bên trong cửa sổ của FFT.
hotpaw2
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.