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()
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()
Dimana aku bisa mendapatkan sebuah implementasi open source dari optimal filter FIR algoritma desain Taman-McClellan (alias 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 ... 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.
sumber
type firpm.m
di MATLAB? Itu akan menunjukkan kepada Anda implementasi fungsi MATLAB.Jawaban:
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 .
sumber
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.
sumber
Versi yang nyaman dapat ditemukan di scipy.signal.remez Python . Bagus jika menggunakan numpy / scipy.
sumber
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
sumber
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.
sumber
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.
sumber
Waspadalah terhadap perbedaan antara matlab firpm dan remez Scipy.signal. Misalnya, kedua pernyataan ini setara:
sumber