Thiết kế bộ lọc FIR: Window vs Công viên McClellan và Least Squares


21

Có bất kỳ lợi thế nào khi sử dụng cách tiếp cận cửa sổ so với các thuật toán của Công viên-McClellan (viết tắt ở đây là PMcC) hoặc thuật toán Least Squares cho thiết kế bộ lọc FIR của bộ lọc thông thấp không? Giả sử với sức mạnh tính toán ngày nay rằng sự phức tạp của chính các thuật toán không phải là một yếu tố.

Câu hỏi này không so sánh PMcC với Least Squares mà cụ thể là nếu có bất kỳ lý do nào để sử dụng bất kỳ kỹ thuật thiết kế FIR nào thay vì các thuật toán đó, hoặc là các kỹ thuật cửa sổ để lọc thiết kế bị lỗi thời bởi các thuật toán đó?

Dưới đây là một so sánh mà tôi đã so sánh một cửa sổ Hamming với phương pháp thiết kế ưa thích của tôi với Least-Squared, sử dụng cùng một số lần chạm. Tôi đã mở rộng băng thông theo cách tiếp cận Least Squared để khớp với cửa sổ Hamming, và trong trường hợp này, rõ ràng là Least-Squared sẽ vượt trội hơn (cung cấp khả năng từ chối băng tần nhiều hơn đáng kể). Tôi chưa làm điều này với tất cả các cửa sổ, điều này dẫn tôi đến câu hỏi liệu bạn có thể thực hiện PMcC và bình phương nhỏ nhất, hoặc nếu có các ứng dụng khác cho bộ lọc thông thấp FIR trong đó phương pháp cửa sổ sẽ được ưa thích hơn?

nhập mô tả hình ảnh ở đây


2
tôi có thể đề nghị so sánh Kaiser chân thành với firpm()firls().
robert bristow-johnson

Câu trả lời:


16

Tôi đồng ý rằng phương pháp thiết kế bộ lọc cửa sổ không còn là một trong những phương pháp thiết kế quan trọng nhất nữa và nó thực sự có thể là trường hợp được trình bày quá nhiều trong sách giáo khoa truyền thống, có thể là do lý do lịch sử.

Tuy nhiên, tôi nghĩ rằng việc sử dụng nó có thể được biện minh trong một số tình huống. Tôi không đồng ý rằng sự phức tạp tính toán không còn là vấn đề nữa. Điều này phụ thuộc vào nền tảng. Ngồi trước máy tính để bàn và thiết kế bộ lọc, chúng tôi thực sự không cần phải lo lắng về sự phức tạp. Tuy nhiên, trên các nền tảng cụ thể và trong các tình huống cần thiết kế trong thời gian thực, độ phức tạp tính toán là một vấn đề và kỹ thuật thiết kế tối ưu đơn giản sẽ được ưu tiên hơn một kỹ thuật tối ưu phức tạp hơn nhiều. Ví dụ, tôi đã từng làm việc trên một hệ thống để định dạng chùm tia trong đó bộ lọc (Beamformer) sẽ cần phải được thiết kế lại một cách nhanh chóng, và vì vậy độ phức tạp tính toán thực sự là một vấn đề.

Tôi cũng tin rằng trong nhiều tình huống thực tế, chúng ta không cần phải lo lắng về sự khác biệt giữa thiết kế tối ưu và tối ưu. Điều này càng trở nên đúng hơn nếu chúng ta cần sử dụng số học điểm cố định với các hệ số lượng tử và kết quả được lượng tử hóa của các phép toán số học.

Một vấn đề khác là sự ổn định về số của các phương pháp thiết kế bộ lọc tối ưu và việc triển khai chúng. Tôi đã gặp một số trường hợp trong đó thuật toán Công viên-McClellan (tôi nên nói rằng, việc triển khai tôi đã sử dụng) đơn giản là không hội tụ. Điều này sẽ xảy ra nếu đặc tả không có nhiều ý nghĩa, nhưng nó cũng có thể xảy ra với các thông số kỹ thuật hoàn toàn hợp lý. Điều tương tự cũng đúng đối với phương pháp thiết kế bình phương tối thiểu trong đó một hệ phương trình tuyến tính cần được giải, điều này có thể trở thành một vấn đề không có điều kiện. Trong những trường hợp này, phương pháp cửa sổ sẽ không bao giờ làm bạn thất vọng.

Một nhận xét về so sánh của bạn giữa phương pháp cửa sổ và thiết kế hình vuông nhỏ nhất: Tôi không nghĩ rằng sự so sánh này cho thấy bất kỳ ưu thế chung nào của phương pháp bình phương nhỏ nhất so với phương pháp cửa sổ. Đầu tiên, bạn dường như xem xét sự suy giảm băng tần, đây không phải là mục tiêu thiết kế cho một trong hai phương pháp. Phương pháp cửa sổ không tối ưu theo bất kỳ ý nghĩa nào và thiết kế hình vuông nhỏ nhất giảm thiểu năng lượng dải dừng và hoàn toàn không quan tâm đến kích thước gợn sóng dải dừng. Những gì có thể thấy là cạnh dải thông của thiết kế cửa sổ lớn hơn một trong những thiết kế hình vuông nhỏ nhất, trong khi cạnh dải dừng lại nhỏ hơn. Do đó, độ rộng dải chuyển tiếp của bộ lọc được thiết kế bằng cửa sổ nhỏ hơn sẽ dẫn đến gợn sóng dải dừng cao hơn. Sự khác biệt về độ rộng dải chuyển tiếp có thể nhỏ, nhưng thuộc tính bộ lọc rất nhạy cảm với tham số này. Không có nghi ngờ rằng bộ lọc hình vuông nhỏ nhất vượt trội hơn bộ lọc khác khi dừng năng lượng dải, nhưng điều đó không dễ thấy như kích thước gợn. Và câu hỏi vẫn còn nếu sự khác biệt đó thực sự sẽ tạo ra sự khác biệt trong một ứng dụng thực tế.

Hãy để tôi chỉ cho bạn thấy những so sánh như vậy thường có thể được thực hiện để nhìn theo cách người ta muốn họ nhìn. Trong hình bên dưới, tôi so sánh bộ lọc thông thấp tối ưu bình phương tối thiểu được thiết kế với chức năng Matlab / Octave firls.m(màu xanh) với bộ lọc thông thấp được thiết kế với phương pháp cửa sổ bằng cửa sổ Kaiser (màu đỏ).

nhập mô tả hình ảnh ở đây

Từ hình vẽ, người ta thậm chí có thể kết luận rằng bộ lọc được thiết kế bằng cửa sổ tốt hơn một chút so với bộ lọc tối ưu bình phương nhỏ nhất. Điều này tất nhiên là vô nghĩa bởi vì chúng tôi thậm chí không định nghĩa "tốt hơn" và bộ lọc bình phương nhỏ nhất phải có lỗi xấp xỉ bình phương trung bình nhỏ hơn. Tuy nhiên, bạn không nhìn thấy điều đó trực tiếp trong hình. Dù sao, điều này chỉ để hỗ trợ cho tuyên bố của tôi rằng người ta phải rất cẩn thận và rõ ràng khi thực hiện các so sánh như vậy.

Tóm lại, ngoài việc hữu ích để học cho sinh viên DSP vì những lý do hoàn toàn không thực tế, tôi nghĩ rằng mặc dù những tiến bộ công nghệ từ những năm 1970, việc sử dụng phương pháp cửa sổ có thể được biện minh trong các tình huống thực tế nhất định và tôi không nghĩ rằng điều đó sẽ thay đổi rất sớm


Câu trả lời hay Matt- Làm rõ cặp đôi / câu hỏi: Liên quan đến sự phức tạp, bạn có thể đưa ra một ví dụ thực tế không? Tôi có thể thấy đây là một vấn đề với việc triển khai, nhưng khi đưa ra các hệ số tôi không thể nghĩ ra lý do tôi sẽ thực hiện thiết kế trên nền tảng kém hơn (do đó là câu hỏi của tôi). Về so sánh, bình phương nhỏ nhất rõ ràng là tốt hơn; cho cùng một gợn và chuyển tiếp, bạn có được sự suy giảm băng tần tốt hơn. Tôi đã tăng chiều rộng băng thông để phù hợp với cả hai; cạnh lớn hơn một chút vì đó là nơi tôi dừng khớp nhưng có thể khớp gần hơn để kết luận.
Dan Boschen

2
@DanBoschen: Tất nhiên, trong hầu hết các trường hợp, thiết kế được thực hiện ngoại tuyến và sự phức tạp không phải là vấn đề. Tuy nhiên, tôi đã bắt gặp các ứng dụng trong đó các bộ lọc sẽ được thiết kế lại theo thời gian thực (đó là một ứng dụng định dạng tia), do đó bạn có vấn đề phức tạp.
Matt L.

1
Và đối với việc tiết kiệm số lượng vòi thực tế bằng một thiết kế tối ưu so với thiết kế cửa sổ, kết quả mà tôi thấy thường gây thất vọng. Thường chỉ cần 1 hoặc 2 vòi, mà đối với nhiều triển khai sẽ không tạo ra nhiều khác biệt.
Matt L.

1
OK, đối với các thiết kế ngoại tuyến và nếu sự ổn định về số hóa ra không có vấn đề gì (đối với thiết kế cụ thể đó; nói chung nó vẫn là một vấn đề), cửa sổ sẽ không hữu ích. Nhưng nói chung, chúng ta không thể luôn dựa vào các thiết kế ngoại tuyến và quan trọng hơn, chúng ta không thể luôn luôn tránh các vấn đề về số. Vì vậy, tôi nghĩ rằng từ 'lỗi thời' vẫn còn quá mạnh.
Matt L.

3
Nói rất hay. Điều cần nhớ là kỹ thuật là tất cả về việc tìm kiếm một triển khai đủ tốt để đáp ứng yêu cầu của bạn. Phương pháp cửa sổ đơn giản để thực hiện và luôn hoạt động. Các phương pháp khác có triển khai phức tạp hơn và có thể có trường hợp chúng khó sử dụng. Tôi đã làm việc với một số hệ thống cần thiết kế các bộ lọc một cách nhanh chóng và phương pháp cửa sổ là phương pháp phù hợp cho những tình huống đó.
Jason R

7

Các bộ lọc của Windowed Sinc có thể được tạo một cách thích ứng khi đang di chuyển trên các bộ xử lý đủ mạnh để chạy bộ lọc FIR liên quan. Bộ lọc cửa sổ có thể được tạo trong thời gian giới hạn hữu hạn.

Việc tạo ra một số bộ lọc Sinc có cửa sổ đơn giản có thể được mô tả hoàn toàn (và được kiểm tra phần mềm độc hại, v.v.) trong một vài dòng mã , so với việc sử dụng mù một số hộp công cụ mờ.

Nền toán học ít cần thiết hơn được yêu cầu để giải thích bộ lọc Sinc có cửa sổ, so với yêu cầu để mã hóa trình tạo bộ lọc PMcC từ đầu.

Các gợn sóng bằng nhau trong đáp ứng tần số của bộ lọc PMcC có thể gây ra các tạo phẩm trong miền thời gian khác nhau (và có lẽ ít mong muốn hơn) so với các tạo phẩm được tạo bởi bộ lọc cửa sổ đơn giản.


1
Có điểm tốt @ hotpaw2, gợn băng thông dẫn đến giao thoa xen kẽ (theo dõi và tiếng vang hàng đầu). Cảm ơn
Dan Boschen

2
Chúng tôi đã nói về công cụ tiền điện tử McClellan trước và sau trên comp.dsp năm 2003 . Alexey Lukin đã đăng một ví dụ MATLAB tối thiểu : f=[0 0.49 0.51 1]; a=[1 1 0 0]; b=remez(300,f,a), cũng chạy trong Octave. Một lời giải thích là với các bộ lọc rất dốc, các gợn sóng có thể đủ thường xuyên để giống với một cosin. Miền thời gian tương đương với cosine miền tần số sẽ là hai tiếng vang xung.
Olli Niemitalo

6

Tôi sẽ chỉ ra ở đây một lợi ích của thiết kế có cửa sổ và một mẹo để nhận được lợi ích tương tự từ Công viên McClellan.

Đối với cửa sổ bộ lọc nửa băng tần, nửa băng, v.v., cửa sổ vẫn giữ các số không trong miền thời gian của hàm chân được chia tỷ lệ, là bộ lọc thông thấp lý tưởng nguyên mẫu. Các số 0 kết thúc ở các hệ số, làm giảm chi phí tính toán của các bộ lọc. Đối với bộ lọc nửa băng tần, thiết kế cửa sổ cung cấp bộ lọc với mọi hệ số chẵn 0 ngoại trừ hệ số trung bình (cũng được coi là chẵn):

Trân trọng
Hình 1. Hàm Sinc được kéo dài theo chiều ngang với hệ số 2 là bộ lọc thông thấp nửa băng nguyên mẫu với mức tăng là 2, phù hợp để lấy mẫu theo hệ số 2.

Tuy nhiên, Công viên McClellan / Remez có thể bị lừa để mang lại lợi ích tương tự bằng cách thiết kế sử dụng bộ lọc với số lượng vòi chẵn chỉ với một dải thông đạt được thống nhất được xác định. Các hệ số thu được được sử dụng làm hệ số lẻ của bộ lọc dài hơn. Hệ số trung bình của bộ lọc dài hơn được đặt thành 1 và các hệ số chẵn khác là 0. Bộ lọc này có mức tăng 2 trong dải thông và gợn đối xứng trong dải thông và dải dừng. Trong Python:

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
c0 = signal.remez(14, [0, 3500.0/8000], [1])
c = np.zeros(c0.size*2-1)
c[0::2] = c0
c[c0.size-1] = 1
freq, response = signal.freqz(c)
plt.semilogy(freq/(2*np.pi), np.abs(response))
plt.show()
plt.plot(range(-c0.size+1, c0.size, 1), c, 'x')
plt.grid(True)
plt.show()

Hình 2.
Hình 2. Các hệ số của bộ lọc nửa băng tần được thiết kế gián tiếp bằng Python scipy.signal.remez.

Hình 3.
Hình 3. Biểu đồ đáp ứng tần số cường độ của bộ lọc nửa băng tần được thiết kế gián tiếp sử dụng scipy.signal.remez.

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.