Là ổn định hơn về mặt số để thực hiện lọc như nhân hoặc tích chập?


12

Tôi đang viết chương trình lọc tín hiệu 20.000 mẫu với bộ lọc Butterworth thứ năm ngoại tuyến. Tôi đã có quyền truy cập vào một triển khai FFT. Dường như có hai lựa chọn thay thế để thực hiện lọc:

  • kết hợp tín hiệu với đáp ứng xung trong miền thời gian, hoặc
  • nhân tín hiệu với đáp ứng xung trong miền tần số và biến đổi nghịch đảo kết quả

Các phương pháp này sẽ giống hệt nhau trong trường hợp FT lý thuyết. Tuy nhiên, làm điều đó trong cuộc sống thực với DFT, tôi cho rằng mọi thứ khác đi. Là một trong những phương pháp số ổn định hơn? Có bất kỳ vấn đề nào khác mà tôi nên nhận thức? Số lượng tính toán không quan trọng.


Phương pháp FFT sẽ nhanh hơn nhiều để tính toán cho hầu hết độ dài tín hiệu. Chỉ có độ dài ngắn là nhanh hơn với tích chập miền thời gian.
endolith

Câu trả lời:


5

Với tích chập, bạn sẽ không gặp phải bất kỳ vấn đề ổn định nào, vì không có bộ lọc đệ quy, do đó bạn sẽ không tích lũy bất kỳ lỗi nào. Nói cách khác, hệ thống là tất cả các số không, không có cực. Tôi đã nghe thấy giai thoại, nhưng bản thân tôi chưa xác minh, rằng tích chập dựa trên FFT có lỗi thấp hơn tích chập miền thời gian, đơn giản vì nó có các phép toán số học O (n log n) thay vì O (n ^ 2).

Thông thường, theo như tôi biết, các bộ lọc Butterworth được triển khai dưới dạng các bộ lọc đệ quy (IIR), vì vậy đó là một chủ đề khác. Bộ lọc IIR có cực cũng như số không, vì vậy có thể có vấn đề ổn định trong thực tế. Ngoài ra, đối với các bộ lọc IIR, các phương thức dựa trên FFT không phải là một tùy chọn, nhưng về mặt ưu việt, các bộ lọc IIR có xu hướng rất thấp.

Đối với các vấn đề về tính ổn định với các bộ lọc IIR, chúng có xu hướng gặp vấn đề ở các đơn hàng cao hơn - tôi sẽ chỉ đưa ra một con số và nói rằng khoảng thứ 6 đang đẩy nó. Thay vào đó, chúng thường được triển khai dưới dạng các tầng được xếp tầng (phần bộ lọc thứ tự thứ 2). Đối với bộ lọc thứ tự thứ 5 của bạn, hãy viết nó dưới dạng hàm truyền miền z (nó sẽ là hàm hợp lý bậc 5), sau đó đưa nó vào 5 cực và 5 số không. Thu thập các liên hợp phức tạp và bạn sẽ có hai bộ lọc và một bộ lọc thứ tự đầu tiên. Nhìn chung, các vấn đề ổn định có xu hướng tăng lên khi các cực gần với vòng tròn đơn vị hơn.

Cũng có thể có các vấn đề về nhiễu và chu kỳ giới hạn trong các bộ lọc IIR, do đó, có các cấu trúc liên kết bộ lọc khác nhau (ví dụ mẫu trực tiếp I, mẫu trực tiếp II) có các thuộc tính số khác nhau, nhưng tôi sẽ không lật đổ điểm này - chỉ sử dụng hai lần độ chính xác và nó gần như chắc chắn sẽ đủ tốt.


Bạn có ý nghĩa gì với nó chỉ hoạt động cho các bộ lọc FIR? Tôi đã giả định rằng bộ lọc IIR sẽ phải được lấy mẫu bằng cách nào đó. Các bộ lọc IIR thường được triển khai trong miền thời gian để tránh điều này?
Andreas

1
Theo như tôi biết, các bộ lọc IIR luôn được triển khai trong miền thời gian. Bộ lọc IIR (ở đây, ví dụ, bộ lọc bậc hai hoặc "biquad") được xác định bởi một phương trình khác biệt như y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Lưu ý rằng đây là sự kết hợp của các mẫu đầu vào trước đó (các giá trị x) và các mẫu đầu ra trước đó (các giá trị y). Bộ lọc FIR chỉ phụ thuộc vào các đầu vào trong quá khứ, vì vậy nó chấp nhận triển khai miền tần số hiệu quả. Bộ lọc IIR thì không, nhưng dù sao thì rất hiệu quả vì bộ lọc IIR có xu hướng thấp hơn nhiều.
schnarf

1
Lý do các bộ lọc IIR có xu hướng thấp hơn nhiều là các cực (phản hồi của các mẫu đầu ra trước đó) cho phép bộ lọc dốc hơn nhiều với rất ít hệ số so với bộ lọc FIR. Khi tôi nói thứ tự thấp hơn nhiều, bộ lọc IIR điển hình có thể là bậc hai (5 hệ số), trong khi bộ lọc FIR điển hình cho cùng một tác vụ có thể có hàng ngàn hệ số.
schnarf

4

Trong hầu hết các trường hợp, lựa chọn tốt nhất của bạn không phải là tích chập hay FFT mà chỉ đơn giản là áp dụng bộ lọc IIR trực tiếp (sử dụng hàm sosfilt ()). Điều này sẽ hiệu quả hơn rất nhiều về mức tiêu thụ CPU và bộ nhớ.

Việc nó có tạo ra sự khác biệt về số hay không phụ thuộc vào bộ lọc cụ thể. Trường hợp duy nhất mà một số khác biệt có thể leo vào là nếu các cực rất, rất gần với vòng tròn đơn vị. Thậm chí có một vài thủ thuật có thể giúp đỡ. KHÔNG SỬ DỤNG biểu diễn và bộ lọc chức năng chuyển () mà sử dụng các cực và số 0 với sosfilt (). Dưới đây là một ví dụ cho sự khác biệt.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

bộ lọc () bị hỏng ở mức cắt khoảng 15Hz @ 44.1kHz. Đối với sosfilt (), mức cắt có thể thấp hơn 1/100 của Hz @ 44.1kHz mà không gặp vấn đề gì.

NẾU bạn có vấn đề về ổn định, FFT cũng không giúp được gì nhiều. Vì bộ lọc của bạn là bộ lọc IIR, đáp ứng xung là vô hạn và trước tiên phải được cắt bớt. Ở những tần số rất thấp này, đáp ứng xung sẽ kéo dài đến mức FFT cũng trở nên không thực tế.

Ví dụ: nếu bạn muốn mức cắt 1/100 Hz @ 44,1 kHz và muốn có dải động trong đáp ứng xung 100 dB, bạn cần khoảng 25 triệu mẫu !!! Đó là gần 10 phút ở 44,1 kHz và lâu hơn nhiều lần so với tín hiệu ban đầu của bạn


Điều này không thực sự trả lời câu hỏi về các vấn đề số, nhưng tôi không nhận thức được vấn đề với filter- cảm ơn! Điểm cắt cao của tôi là 0,5 Hz @ 250 Hz. Lý do cho các vấn đề với là filtergì? Tôi đang tự viết bài thực hiện.
Andreas

2

Tại sao bạn cho rằng mọi thứ sẽ khác? Các khái niệm lý thuyết nên chuyển sang các ứng dụng thực tế, với sự khác biệt duy nhất là các vấn đề về dấu phẩy động, mà chúng ta không thể thoát ra. Bạn có thể dễ dàng xác minh bằng một ví dụ đơn giản trong MATLAB:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

Như bạn có thể thấy, các lỗi thuộc về độ chính xác của máy. Không nên có bất kỳ lý do nào để không sử dụng phương pháp FFT. Như Endolith đã đề cập, việc sử dụng phương pháp FFT để lọc / kết hợp / tương quan chéo, v.v. và nhanh hơn rất nhiều, ngoại trừ các mẫu rất nhỏ (như trong ví dụ này). Không phải việc xử lý miền thời gian không bao giờ được thực hiện ... tất cả đều tập trung vào ứng dụng, nhu cầu và các ràng buộc.


1
Tôi nghĩ rằng câu hỏi ban đầu đã đi sâu vào các vấn đề dấu phẩy động vốn có trong bộ lọc dựa trên FFT so với việc thực hiện trực tiếp bộ lọc trong miền thời gian. Đây có thể là một mối quan tâm thực sự đối với việc xử lý tín hiệu điểm cố định, nếu bạn có các bộ lọc thực sự dài hoặc nếu bạn có triển khai FFT không tốt, chẳng hạn. Bạn chắc chắn sẽ không thấy bất kỳ hiệu ứng nào cho chuỗi có độ dài 5 ở điểm nổi chính xác kép.
Jason R

@JasonR Các lỗi vẫn là độ chính xác của máy nếu bạn mở rộng độ dài của chuỗi thành 1e6 trong ví dụ trên. Các lỗi mà bạn đề cập đến chủ yếu là do thiết kế bộ lọc kém hoặc triển khai FFT kém. Nếu những điều đó là tốt, tôi không thấy lý do tại sao tích chập trong miền thời gian sẽ đưa ra một câu trả lời khác với câu đó trong miền tần số.
Lorem Ipsum

1
Không nên đưa ra một câu trả lời khác nhau dựa trên miền bạn thực hiện tính toán. Điểm duy nhất của tôi là các phép toán thực tế khác nhau rất nhiều giữa hai cách tiếp cận, do đó tùy thuộc vào cách triển khai của từng miền mà bạn có sẵn, có thể là bạn có thể thấy sự khác biệt hữu hình. Đối với độ chính xác kép, giả sử bạn có triển khai tốt, tôi sẽ không mong đợi bất kỳ sự khác biệt nào ngoại trừ trong các trường hợp cực đoan.
Jason R
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.