Parks-McClellan最適FIRフィルター設計アルゴリズムのオープンソース実装はどこで入手できますか?


20

背景:私はしばしば、独自のフィルターを必要とする何らかの信号処理タスクを行っています。通常、この時点でMATLABに行き、firpm()を使用して新しい一意のフィルターを生成します。MATLAB firpm()関数は、そのParks-McClellanアルゴリズムを実装します。これでフィルターができたので、フィルターをハードコーディングされた配列に入れました。しかし、1つのシナリオでのみ機能するハードコードされたフィルターがあるという問題があります。

問題:信号処理の問題を解決できるようになりましたが、非常に特定のシングルサンプルレートまたは特定のシナリオの場合のみです。

目標: Cコードまたは他の言語からfirpm()を呼び出して、信号処理コードをより汎用的にしたい。のオープンソース実装が見つかりませんfirpm()

Parks-McClellan最適FIRフィルター設計アルゴリズム(MATLABでは別名firpm()オープンソース実装はどこで入手できますか?

  • PS私は、ウィンドウ処理などを使用してフィルタを異なる方法で設計できることを認識しています...コメントでそれらを自由に言及してください。しかし、この質問のポイントは、「他のフィルター設計手法とは何ですか?」ポイントは、非常に便利なfirpm() ...または類似のもののオープンソース実装を見つけることです。

  • PPSこの質問の目標の1つは、最初にコードを見て、Parks-McClellanアルゴリズムがどのように機能するかを学習することです。その後、背景理論を読む予定です。


ソリューションが無料であることは重要ですか?Matlab C APIを調査しましたか?

2
最優先事項は、ソースコードを見ることです(できればフォートランではないので、目を刺す必要はありません)。私はそれが無料でなければならないという制限を設けません(多分、ある種のオープンソースだがフリーでないソースコードがあるでしょう)。
トレバーボイドスミス

3
Matlabコンパイラを使用してMatlabをコンパイルし、Matlab Runtimeを使用して配布できることを承知しています。したがって、技術的には顧客がMatlabライセンスを支払う必要はありません。また、Matlab Engine(別名CからMatlab API)についても知っています。私は通常、どちらも利用できない組み込みプラットフォームで実行しているため、これらは両方とも無関係です。
トレバーボイドスミス

1
@TrevorBoydSmithソースコードを見たいだけなのでtype firpm.m、MATLABで試しましたか?これにより、MATLABの関数の実装が表示されます。
Loremのイプサム

1
FIRフィルター設計は信号処理に非常に役立ち、parks-mcclelanは重要なテーマです。それでも、IMOがdsp.stackexchange憲章にぴったりと当てはまるという主題について尋ねたことに対して、私は繰り返し下票されています。ダウン票について説明してください。
トレバーボイドスミス

回答:


5

ここだLGPL版のRemez交換アルゴリズムのは。オクターブコードはそこから派生したようです。ウィキペディアのページParks McClellanのページからリンクされていました。
オリジナルのJanovetzコードは、オクターブ呼び出しを持たないため、プロジェクトでより簡単に使用できますが、remez.ccファイルのバグ修正または高速化に関する情報については、オクターブフォージsvn changelog を掘り下げることをお勧めします。 。


プロジェクトでJanovetzのコードを使用するのは簡単であることに同意します。また、オクターブ実装の変更ログを確認することは非常に賢明であることにも間違いなく同意します。
トレバーボイドスミス

JanovetzコードIMOはおそらく最初または2番目のドラフトです...が、Octaveコードのように頻繁に使用されていません。
トレバーボイドスミス

非常に重要な注意:JanovetzコードはLGPLであるため、商用設定で使用できます。
トレバーボイドスミス

答えから最初のリンクはとても壊れている、ここで同じ実装が使用されているライブラリへのリンクです。
マクタ14

11

MATLABに似た環境のフリーソフトウェア実装であるGNU Octaveには、Parks-McClellan(Remez交換アルゴリズムとも呼ばれます)のオープンソース実装があります。「remez」と呼ばれる関数は、Octave-Forgeでホストされる「signal」パッケージに含まれています。パッケージをダウンロードすると、アルゴリズムのC ++実装である「remez.cc」が見つかります。

Octaveの優れた点の1つは、MATLABとほぼコード互換性があるため、必要に応じてコードを簡単に移植して使用できることです。これは、MATLABでMEX形式で提供されるアルゴリズムの実装を内部で覗くのに良い方法です。


「Parks-McClellanアルゴリズムは、RemezアルゴリズムまたはRemez交換アルゴリズムのバリエーションであり、FIRフィルター用に特別に設計され、FIRフィルター設計の標準的な方法に変更されています。」また、scipyのダウンロード中:docs.scipy.org/doc/scipy/reference/generated/...
endolith


2

CのParks McClellanアルゴリズムの別のソースを次に示します。このコードは、元の69個のgotoステートメントのうち61個が削除されているという点で、上記のSciPyコードとは異なります(SciPyコードにはまだ約37個のgotoがあります)。また、ゼロ除算が発生する可能性のある3つの場所でコードを修正し、バンドエッジ値を範囲チェックする追加のコードをいくつか持っています。

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


1

多分あなたはこれをすでに知っているかもしれませんが、matlabがある場合はmatlabコーダーを使用して、調べたい機能を使用する簡単な関数を作成できます。次に、実行して、作成されたCコードを確認します。私はFFTとQR分解で試しましたが、少し面倒ですが、うまく理解できます。


1

「コア」レメッツアルゴリズムの実際のMatlabバージョンを実行する論文です。「Remez多重交換アルゴリズムの当初のアイデアに従ったMATLABベースの最適マルチバンドFIRフィルター設計プログラム」-2011 IEEE International Symposium on Circuits and Systems(ISCAS)-Authors(Ahsan、Saramaki)

このホワイトペーパーは、基本的なアルゴリズムの説明に適しています。この論文の目的は、元のFortranコードの使用を避けることでした。これは、アルゴリズムをあまり説明しておらず、多くの場合、さまざまな他の言語に直接翻訳されるだけです。

1つコメントします。アルゴリズムの中心的なアイデアの1つは、曲線を近似してから極値点を見つけることです。通常、この考えを説明するためにラグランジュ補間が使用されますが、ラグランジュ補間は数値特性が不十分です。元のアルゴリズムでは、ラグランジュ補間の重心実装を使用します。これにより、ラグランジュ補間の関連する落とし穴の多くが回避されます。したがって、コードを完全に理解しようとしている場合は、重心補間を調べてください。


論文を見ると、これはParks-McClellanコードの修正版です。Remez交換アルゴリズムに基づいていますが、パフォーマンスが向上する傾向があり、PMアルゴリズム(またはMatlabの実装)から得られるフィルターよりもはるかに長いフィルターを設計できます。
デビッド

1

MatlabのfirpmとScipy.signalのレメッツの違いに注意してください。たとえば、次の2つのステートメントは同等です。

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

remez(11, [0.1, 0.4], [1], type='hilbert')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.