Tôi có thể nhận triển khai mã nguồn mở của thuật toán thiết kế bộ lọc tối ưu FIR-McClellan ở đâu?


20

Bối cảnh: Thường thì tôi đang thực hiện một số loại tác vụ xử lý tín hiệu yêu cầu một bộ lọc duy nhất. Thông thường tại thời điểm này tôi đi đến MATLAB và tạo một bộ lọc duy nhất mới bằng cách sử dụng . Hàm MATLAB thực hiện thuật toán Công viên-McClellan. Bây giờ tôi có một bộ lọc và tôi đặt bộ lọc vào một mảng mã hóa cứng. Nhưng đây là vấn đề bây giờ tôi có một bộ lọc mã hóa cứng chỉ hoạt động cho một kịch bản.firpm()firpm()

Vấn đề: Bây giờ tôi có thể giải quyết vấn đề xử lý tín hiệu của mình ... nhưng chỉ với một tỷ lệ mẫu rất CỤ THỂ hoặc kịch bản CỤ THỂ.

Mục tiêu: Tôi muốn có thể gọi từ mã C hoặc một số ngôn ngữ khác và làm cho mã xử lý tín hiệu của tôi chung chung hơn. Tôi không thể tìm thấy một triển khai nguồn mở !firpm()firpm()

Tôi có thể nhận triển khai mã nguồn mở của thuật toán thiết kế bộ lọc tối ưu FIR-McClellan ở đâu (hay còn gọi là trong MATLAB)?firpm()

  • Tái bút: Tôi biết rằng tôi có thể thiết kế các bộ lọc khác nhau bằng cách sử dụng cửa sổ hoặc một cái gì đó khác ... vui lòng đề cập đến các bộ lọc trong các nhận xét. Nhưng vấn đề của câu hỏi này là không hỏi "các kỹ thuật thiết kế bộ lọc khác là gì?" vấn đề là tìm ra một triển khai nguồn mở của RẤT RẤT hữu ích ... hoặc một cái gì đó tương tự.firpm()

  • PPS Một trong những mục tiêu của câu hỏi này là tìm hiểu cách hoạt động của thuật toán Công viên-McClellan bằng cách xem mã trước và sau đó tôi dự định đọc một số lý thuyết cơ bản.


Điều quan trọng là giải pháp là miễn phí? Bạn đã điều tra API Matlab C chưa?

2
Ưu tiên cao nhất là tôi muốn xem mã nguồn (tốt nhất không phải là fortran vì vậy tôi không cần phải trợn mắt ra). Tôi sẽ không đặt ra hạn chế rằng nó phải miễn phí (có thể có một số loại mã nguồn mở nhưng không miễn phí).
Trevor Boyd Smith

3
Tôi biết rằng bạn có thể biên dịch Matlab bằng trình biên dịch Matlab và sau đó phân phối bằng Matlab Runtime ... vì vậy về mặt kỹ thuật, khách hàng của bạn không phải trả tiền cho giấy phép Matlab. Tôi cũng biết về Matlab Engine (còn gọi là API C đến Matlab). Cả hai thứ này đều không liên quan vì tôi thường chạy trên nền tảng nhúng mà không có sẵn.
Trevor Boyd Smith

1
@TrevorBoydSmith Vì bạn chỉ muốn xem mã nguồn, bạn đã thử type firpm.mtrong MATLAB chưa? Điều đó sẽ cho bạn thấy việc thực hiện chức năng của MATLAB.
Lorem Ipsum

1
Thiết kế bộ lọc FIR rất hữu ích để xử lý tín hiệu và công viên - mcclelan là một vấn đề không hề nhỏ. Tuy nhiên, tôi vẫn bị bỏ phiếu nhiều lần vì đã hỏi về một chủ đề mà IMO phù hợp với điều lệ của dsp.stackexchange. Hãy giải thích downvote của bạn.
Trevor Boyd Smith

Câu trả lời:


5

Đây là phiên bản LGPL của thuật toán trao đổi Remez. Mã quãng tám dường như bắt nguồn từ nó. Nó được liên kết từ trang wikipedia Công viên trang McClellan .
Mã Janovetz ban đầu có thể dễ sử dụng hơn trong dự án của bạn, vì nó không có các cuộc gọi quãng tám, nhưng sẽ rất khôn ngoan khi tìm hiểu thông tin thay đổi svn octave-forge cho bất kỳ thông tin nào về lỗi hoặc tăng tốc trong tệp remez.cc .


Tôi đồng ý sử dụng mã Janovetz trong một dự án sẽ dễ dàng hơn vì nó thẳng C. Tôi cũng chắc chắn đồng ý rằng việc kiểm tra nhật ký thay đổi của việc thực hiện quãng tám sẽ rất thông minh.
Trevor Boyd Smith

Mã IMO của Janovetz có lẽ là bản nháp đầu tiên hoặc thứ hai ... nhưng chưa được sử dụng nhiều như mã Octave.
Trevor Boyd Smith

LƯU Ý RẤT QUAN TRỌNG: Mã Janovetz là LGPL để bạn có thể sử dụng nó trong cài đặt thương mại.
Trevor Boyd Smith

Liên kết đầu tiên từ câu trả lời bị hỏng, vì vậy đây là một liên kết đến một thư viện nơi sử dụng cùng một triển khai.
Machta

11

Có một triển khai mã nguồn mở của Công viên-McClellan (còn được gọi là thuật toán trao đổi Remez) trong GNU Octave, một triển khai phần mềm miễn phí của môi trường giống như MATLAB. Hàm, được gọi là "remez", được chứa trong gói "signal" , được lưu trữ tại Octave-Forge . Nếu bạn tải xuống gói, bạn sẽ tìm thấy "remez.cc", triển khai thuật toán C ++.

Một điều thú vị về Octave là nó gần như tương thích mã với MATLAB, vì vậy bạn có thể dễ dàng chuyển mã qua sử dụng ở đó nếu muốn. Đây là một cách hay để xem lén trong việc triển khai các thuật toán được cung cấp dưới dạng MEX trong MATLAB.


"Thuật toán Công viên-McClellan là một biến thể của thuật toán Remez hoặc thuật toán trao đổi Remez, với sự thay đổi được thiết kế riêng cho các bộ lọc FIR và đã trở thành một phương pháp tiêu chuẩn cho thiết kế bộ lọc FIR." Cũng trong SciPy: docs.scipy.org/doc/scipy/reference/generated/
endolith


2

Đây là một nguồn khác cho thuật toán Công viên McClellan trong C. Mã này khác với mã SciPy được đề cập ở trên, nó có 61 trong số 69 câu lệnh goto ban đầu bị xóa (mã SciPy vẫn còn khoảng 37 goto). Nó cũng sửa mã ở 3 vị trí có thể chia cho 0 và nó có một số mã bổ sung để kiểm tra các giá trị cạnh của dải.

http://www.iowahills.com/A7ExampleCodePage.html


1

có thể bạn đã biết điều này, nhưng nếu bạn có MATLAB, bạn có thể sử dụng bộ mã hóa MATLAB và tạo một hàm đơn giản sử dụng tính năng bạn muốn kiểm tra. Sau đó chạy nó và xem mã C đã tạo. Tôi đã thử với FFT, và với phân tách QR, và trong khi nó hơi lộn xộn, nó có thể được hiểu là tốt.


1

Đây là một bài báo thực hiện một phiên bản Matlab thực tế của thuật toán remez "cốt lõi". Chương trình thiết kế bộ lọc FIR đa cấp tối ưu dựa trên MATLAB theo ý tưởng ban đầu của thuật toán trao đổi đa năng Remez, Hội nghị chuyên đề quốc tế về mạch và hệ thống (ISCAS) của IEEE (Ahsan, Saramaki)

Bài viết này làm một công việc tốt trong việc giải thích các thuật toán cơ bản. Mục tiêu của bài viết là tránh sử dụng mã Fortran gốc - vốn không giải thích thuật toán này tốt và thường được dịch trực tiếp sang nhiều ngôn ngữ khác.

Một điều tôi sẽ bình luận. Một trong những ý tưởng cốt lõi của thuật toán là khớp một đường cong và sau đó tìm các điểm cực trị. Thông thường Nội suy Lagrange được sử dụng để giải thích ý tưởng này, nhưng Nội suy Lagrange có các thuộc tính số kém. Trong thuật toán ban đầu, việc sử dụng Thực hiện Barycentric của Nội suy Lagrange - giúp tránh được nhiều cạm bẫy liên quan đến nội suy Lagrangian. Vì vậy, nếu bạn đang cố gắng để hiểu đầy đủ về mã, bạn có thể muốn tìm kiếm Nội suy Barycentric.


Nhìn vào bài báo - đó là một phiên bản sửa đổi của mã Công viên-McClellan. Nó vẫn dựa trên thuật toán trao đổi Remez, nhưng nó có xu hướng có hiệu suất tốt hơn và cho phép bạn thiết kế các bộ lọc dài hơn nhiều so với các thuật toán bạn nhận được từ thuật toán PM (hoặc triển khai Matlab của nó).
David

1

Cảnh giác với sự khác biệt giữa linh hồn của Matlab và Remip của Scipy.signal. Ví dụ: hai câu lệnh này tương đương nhau:

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
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.