Parks-McClellan optimal FIR filtre tasarım algoritmasının açık kaynaklı bir uygulamasını nereden edinebilirim?


20

Arka plan: Genellikle benzersiz bir filtre gerektiren bir tür sinyal işleme görevi yapıyorum. Genellikle bu noktada MATLAB'a gidip firpm() kullanarak benzersiz bir filtre oluştururum . MATLAB firpm()işlevi Parks-McClellan algoritmasını uygular. Şimdi bir filtrem var ve filtreyi sabit kodlu bir diziye koyuyorum. Ama sorun şu anda sadece bir senaryo için çalışan bir sabit kodlu filtre var.

Sorun: Şimdi sinyal işleme problemimi du-jour'u çözebilirim ... ama sadece çok SPECIFIC tek örnekleme hızı veya SPECIFIC senaryosu için.

Amaç: firpm() 'yi C kodundan veya başka bir dilden arayabilmek ve sinyal işleme kodumu daha genel hale getirmek istiyorum. Açık kaynak kodlu bir uygulama bulamıyorum firpm()!

Parks-McClellan optimal FIR filtre tasarım algoritmasının (aka firpm() MATLAB'da) açık kaynaklı bir uygulamasını nereden edinebilirim ?

  • PS Pencereyi veya başka bir şeyi kullanarak farklı filtreler tasarlayabileceğimin farkındayım ... yorumlarda bunlardan bahsetmekten çekinmeyin. Ancak bu sorunun amacı "diğer filtre tasarım teknikleri nelerdir?" nokta ÇOK ÇOK yararlı fbenrpm() ... ya da benzeri bir açık kaynak uygulaması bulmaktır .

  • PPS Bu sorunun amaçlarından biri, ilk olarak koda bakarak Parks-McClellan algoritmasının nasıl çalıştığını öğrenmek ve daha sonra bazı arka plan teorisini okumayı planlamaktır.


Çözümün ücretsiz olması önemli mi? Matlab C API'sını araştırdınız mı?

2
En yüksek öncelik, kaynak kodunu görmek istiyorum (tercihen fortran değil, bu yüzden gözlerimi bıçaklamak zorunda değilim). Ben özgür olmalı kısıtlama koymak olmaz (belki açık kaynak bir tür ama özgür olmayan kaynak kodu vardır).
Trevor Boyd Smith

3
Matlab'ı Matlab derleyicisini kullanarak derleyebileceğinizi ve daha sonra Matlab Runtime'ı kullanarak dağıtabileceğinizin farkındayım ... teknik olarak müşterinizin Matlab lisansı için ödeme yapması gerekmez. Ayrıca Matlab Engine'in (Matlab API'sı olarak da bilinir) farkındayım. Bunların ikisi de ilgisiz çünkü genellikle hiçbirinin mevcut olmadığı gömülü bir platformda çalışıyorum.
Trevor Boyd Smith

1
@TrevorBoydSmith Sadece kaynak koduna bakmak istediğiniz için type firpm.mMATLAB'da denediniz mi? Bu size MATLAB'ın işlevi uygulamasını gösterecektir.
Lorem Ipsum

1
FIR filtre tasarımı sinyal işleme için çok yararlıdır ve parklar-mcclelan önemsiz bir konudur. Yine de IMO'nun dsp.stackexchange tüzüğüne tam olarak uyduğu bir konuyu sorduğum için tekrar tekrar oy kullanıyorum. Lütfen downvotes açıklayın.
Trevor Boyd Smith

Yanıtlar:


5

İşte Remez değişim algoritmasının LGPL sürümü . Oktav kodu bundan türetilmiş gibi görünüyor. Vikipedi sayfası Parks McClellan sayfasından bağlandı .
Orijinal Janovetz kodu projenizde daha kolay kullanılabilir olabilir, çünkü oktav çağrıları yoktur, ancak remez.cc dosyasındaki hata düzeltmeleri veya hızlandırmaları hakkında herhangi bir bilgi için oktav-forge svn changelog'u kazmak akıllıca olacaktır. .


Bir projede Janovetz kodunu kullanmanın daha kolay olacağını kabul ediyorum, çünkü C düz. Oktav uygulamasının değişiklik günlüğünü kontrol etmenin çok akıllı olacağını da kesinlikle kabul ediyorum.
Trevor Boyd Smith

Janovetz kodu IMO muhtemelen birinci veya ikinci taslaktır ... ancak Octave kodu gibi çok kullanılmamıştır.
Trevor Boyd Smith

ÇOK ÖNEMLİ NOT: Janovetz kodu LGPL'dir, böylece ticari bir ortamda kullanabilirsiniz.
Trevor Boyd Smith

Yanıttaki ilk bağlantı kesildi, bu yüzden burada aynı uygulamanın kullanıldığı bir kütüphaneye bir bağlantı var.
Machta

11

MATLAB benzeri bir ortamın ücretsiz yazılım uygulaması olan GNU Octave'de Parks-McClellan'ın (Remez değişim algoritması olarak da bilinir) açık kaynaklı bir uygulaması var. "Remez" olarak adlandırılan işlev Octave-Forge'da barındırılan "sinyal" paketinde bulunur . Paketi indirirseniz, algoritmanın bir C ++ uygulaması olan "remez.cc" yi bulacaksınız.

Octave ile ilgili güzel bir şey, MATLAB ile neredeyse kod uyumlu olmasıdır, bu yüzden isterseniz kodu kullanmak için kolayca bağlantı kurabilirsiniz. MATLAB'da MEX biçiminde sağlanan algoritma uygulamalarına göz atmak için iyi bir yoldur.


"Parks-McClellan algoritması, Remez algoritmasının veya Remez değişim algoritmasının bir varyasyonudur ve değişikliğin FIR filtreleri için özel olarak tasarlanması ve FIR filtre tasarımı için standart bir yöntem haline gelmesidir." Ayrıca SciPy: docs.scipy.org/doc/scipy/reference/generated/...
Endolit


2

C'deki Parks McClellan algoritması için başka bir kaynak. Bu kod, yukarıda belirtilen SciPy kodundan farklıdır, orijinal 69 goto ifadesinin 61'i kaldırılmıştır (SciPy kodu hala yaklaşık 37 goto'dur). Ayrıca kodu sıfıra bölmenin olabileceği 3 yerde sabitler ve bant kenarı değerlerini kontrol eden bazı ek kodlara sahiptir.

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


1

belki bunu zaten biliyorsunuzdur, ancak matlabınız varsa matlab kodlayıcıyı kullanabilir ve incelemek istediğiniz özelliği kullanan basit bir işlev oluşturabilirsiniz. Sonra çalıştırın ve oluşturulan C kodunu görün. FFT ve QR ayrışımı ile denedim ve biraz dağınık olsa da, gayet iyi anlaşılabilir.


1

İşte "çekirdek" remez algoritmasının gerçek bir Matlab sürümünü yapan bir makale. “Remez çoklu değişim algoritması hakkındaki orijinal fikri izleyen MATLAB tabanlı optimum çok bantlı FIR filtreleri tasarım programı” -2011 IEEE Uluslararası Devreler ve Sistemler Sempozyumu (ISCAS) - Yazarlar (Ahsan, Saramaki)

Bu makale temel algoritmayı açıklamada iyi bir iş çıkarmıştır. Makalenin amacı, algoritmayı çok iyi açıklamayan ve çoğu zaman doğrudan diğer dillere çevrilen orijinal Fortran kodunu kullanmaktan kaçınmaktı.

Yorum yapacağım bir şey var. Algoritmanın temel fikirlerinden biri bir eğriye uymak ve daha sonra uç noktaları bulmaktır. Genellikle bu fikri açıklamak için bir Lagrange İnterpolasyonu kullanılır, ancak Lagrange İnterpolasyonu zayıf sayısal özelliklere sahiptir. Orijinal algoritmada Lagrange İnterpolasyonunun Barycentric Uygulaması - Lagrange enterpolasyonunun ilişkili tuzaklarının çoğunu önler. Bu nedenle, kodu tam olarak anlamaya çalışıyorsanız, Barycentric Interpolation'ı aramak isteyebilirsiniz.


Makaleye bakıldığında, Parks-McClellan kodunun değiştirilmiş bir versiyonudur. Yine de Remez değişim algoritmasına dayanıyor, ancak daha iyi performansa sahip olma eğilimindedir ve PM algoritmasından (veya Matlab'ın uygulamasını) aldığınızdan çok daha uzun filtreler tasarlamanıza izin verir.
David

1

Matlab's firpm ve Scipy.signal remez arasındaki farklara dikkat edin. Örneğin, bu iki ifade eşdeğerdir:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.