Di mana saya bisa mendapatkan implementasi open source dari algoritma desain filter FIR optimal Parks-McClellan?

20

Latar Belakang: Sering kali saya melakukan semacam tugas pemrosesan sinyal yang memerlukan filter unik. Biasanya pada titik ini saya pergi ke MATLAB dan menghasilkan filter unik baru menggunakan . Fungsi MATLAB mengimplementasikan algoritma Parks-McClellan. Sekarang saya memiliki filter dan saya meletakkan filter ke dalam array hardcoded. Tapi di sini masalahnya saya sekarang memiliki filter hardcoded yang hanya berfungsi untuk satu skenario.firpm()firpm()

Masalahnya: Saya sekarang dapat menyelesaikan masalah pemrosesan sinyal saya du-jour ... tetapi hanya untuk laju sampel tunggal yang sangat SPESIFIK atau skenario SPESIFIK.

Tujuannya: Saya ingin dapat memanggil dari kode C atau bahasa lain dan membuat kode pemrosesan sinyal saya lebih umum. Saya tidak dapat menemukan implementasi open source dari !firpm()firpm()

Dimana aku bisa mendapatkan sebuah implementasi open source dari optimal filter FIR algoritma desain Taman-McClellan (alias firpm() di MATLAB)?

  • PS Saya sadar bahwa saya dapat mendesain filter secara berbeda menggunakan windowing atau yang lainnya ... jangan ragu untuk menyebutkan yang ada di komentar. Tetapi inti dari pertanyaan ini bukan untuk bertanya "apa teknik desain filter lainnya?" intinya adalah untuk menemukan sebuah implementasi open source dari sangat sangat berguna firpm() ... atau sesuatu yang serupa.

  • PPS Salah satu tujuan dari pertanyaan ini adalah untuk mempelajari bagaimana algoritma Parks-McClellan bekerja dengan melihat kode terlebih dahulu dan kemudian saya berencana membaca beberapa teori latar belakang.

Trevor Boyd Smith
sumber
Apakah penting bahwa solusinya gratis? Sudahkah Anda menyelidiki Matlab C API?
2
Prioritas tertinggi adalah saya ingin melihat kode sumber (lebih baik tidak fortran jadi saya tidak perlu menusuk keluar mata saya). Saya tidak akan meletakkan batasan bahwa itu harus gratis (mungkin ada semacam open source tetapi kode sumber tidak bebas).
Trevor Boyd Smith
3
Saya sadar bahwa Anda dapat mengkompilasi Matlab menggunakan kompiler Matlab dan kemudian mendistribusikan menggunakan Matlab Runtime ... jadi secara teknis pelanggan Anda tidak perlu membayar lisensi Matlab. Saya juga mengetahui Matlab Engine (alias C to Matlab API). Kedua hal ini tidak relevan karena saya biasanya berjalan pada platform tertanam di mana keduanya tidak tersedia.
Trevor Boyd Smith
1
@TrevorBoydSmith Karena Anda hanya ingin melihat kode sumber, apakah Anda sudah mencoba type firpm.mdi MATLAB? Itu akan menunjukkan kepada Anda implementasi fungsi MATLAB.
Lorem Ipsum
1
Desain filter FIR sangat berguna untuk pemrosesan sinyal dan park-mcclelan adalah subjek yang tidak sepele. Namun saya sedang down voting berulang kali untuk menanyakan tentang subjek yang IMO cocok tepat di charter dsp.stackexchange Tolong jelaskan downvotes Anda.
Trevor Boyd Smith

Jawaban:

5

Berikut adalah versi LGPL dari algoritma pertukaran Remez. Kode oktaf tampaknya berasal dari itu. Itu ditautkan dari halaman wikipedia halaman Parks McClellan .
Kode Janovetz asli mungkin lebih mudah digunakan dalam proyek Anda, karena tidak memiliki panggilan oktaf, tetapi akan lebih bijaksana untuk menggali melalui changelog oktaf-forge svn untuk info apa pun tentang perbaikan bug atau peningkatan dalam file remez.cc .

Mark Borgerding
sumber
Saya setuju menggunakan kode Janovetz dalam sebuah proyek akan lebih mudah karena itu adalah lurus C. Saya juga pasti setuju bahwa memeriksa log perubahan dari implementasi oktaf akan sangat cerdas.
Trevor Boyd Smith
IMO kode Janovetz mungkin merupakan konsep pertama atau kedua ... tetapi belum banyak digunakan seperti kode Oktaf.
Trevor Boyd Smith
CATATAN SANGAT PENTING: Kode Janovetz adalah LGPL sehingga Anda dapat menggunakannya dalam pengaturan komersial.
Trevor Boyd Smith
Tautan pertama dari jawabannya rusak jadi di sini adalah tautan ke perpustakaan tempat implementasi yang sama digunakan.
Machta
11

Ada implementasi open-source dari Parks-McClellan (juga dikenal sebagai algoritma pertukaran Remez) di GNU Octave, implementasi perangkat lunak bebas dari lingkungan seperti-MATLAB. Fungsi, yang disebut "remez", terkandung dalam paket "sinyal" , yang di-host di Octave-Forge . Jika Anda mengunduh paket, Anda akan menemukan "remez.cc", sebuah implementasi algoritma C ++.

Satu hal yang menyenangkan tentang Octave adalah bahwa hampir kompatibel dengan kode dengan MATLAB, sehingga Anda dapat dengan mudah porting kode untuk digunakan di sana jika Anda suka. Ini cara yang baik untuk mengintip di bawah kap pada implementasi algoritma yang disediakan dalam bentuk MEX di MATLAB.

Jason R
sumber
"Algoritma Parks-McClellan adalah variasi dari algoritma Remez atau algoritma pertukaran Remez, dengan perubahan yang secara khusus dirancang untuk filter FIR dan telah menjadi metode standar untuk desain filter FIR." Juga di SciPy: docs.scipy.org/doc/scipy/reference/generated/…
endolith
2

Berikut adalah sumber lain untuk algoritme Parks McClellan dalam C. Kode ini berbeda dari kode SciPy yang disebutkan di atas karena memiliki 61 dari 69 pernyataan goto asli dihapus (kode SciPy masih memiliki sekitar 37 goto). Itu juga memperbaiki kode di 3 tempat di mana membagi dengan nol dapat terjadi dan memiliki beberapa kode tambahan yang berkisar memeriksa nilai-nilai tepi band.

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

user5108_Dan
sumber
1

mungkin Anda sudah mengetahui hal ini, tetapi jika Anda memiliki matlab Anda dapat menggunakan matlab coder, dan membuat fungsi sederhana yang menggunakan fitur yang ingin Anda periksa. Kemudian jalankan dan lihat kode C yang dibuat. Saya mencoba dengan FFT, dan dengan dekomposisi QR, dan meskipun agak berantakan, dapat dipahami dengan baik.

tulang
sumber
1

Berikut adalah makalah yang melakukan versi Matlab aktual dari algoritma remez "core". “Program desain filter multiband FIR optimal MATLAB yang mengikuti ide asli dari algoritma pertukaran ganda Remez” -2011 Simposium Internasional IEEE tentang Sirkuit dan Sistem (ISCAS) - Penulis (Ahsan, Saramaki)

Makalah ini melakukan pekerjaan dengan baik dalam menjelaskan algoritma dasar. Tujuan dari makalah ini adalah untuk menghindari penggunaan kode Fortran asli - yang tidak menjelaskan algoritma dengan sangat baik dan sering hanya diterjemahkan ke berbagai bahasa lainnya secara langsung.

Satu hal yang akan saya komentari. Salah satu ide inti dari algoritma ini adalah menyesuaikan kurva dan kemudian menemukan titik-titik ekstrem. Biasanya Interpolasi Lagrange digunakan untuk menjelaskan ide ini, tetapi Interpolasi Lagrange memiliki sifat numerik yang buruk. Dalam algoritma asli penggunaan Implementasi Barycentric dari Interpolasi Lagrange - yang menghindari banyak perangkap terkait interpolasi Lagrangian. Jadi jika Anda mencoba untuk memahami kode sepenuhnya, Anda mungkin ingin mencari Interpolasi Barycentric.

David
sumber
Melihat kertas - itu adalah versi modifikasi dari kode Parks-McClellan. Itu masih didasarkan pada algoritma pertukaran Remez, tetapi cenderung memiliki kinerja yang lebih baik, dan memungkinkan Anda untuk merancang filter yang jauh lebih lama daripada yang Anda dapatkan dari algoritma PM (atau implementasi Matlab untuk itu).
David
1

Waspadalah terhadap perbedaan antara matlab firpm dan remez Scipy.signal. Misalnya, kedua pernyataan ini setara:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
Zhanwen Chen
sumber