PySide6 + SciPy 製のデジタルフィルタ設計 GUIです。FIR(カイザー窓) と IIR(Chebyshev II, SOS) を切り替え、ローパス/ハイパス/バンドパスのいずれかを設計できます。設計結果として ゲイン/位相線図、インパルス応答、C言語配列の係数 を出力します。
ライセンス: MIT(本リポジトリ内の
LICENSE参照)
-
FIR (Kaiser) / IIR (Chebyshev II, SOS) を切替
-
ローパス / ハイパス / バンドパス対応
-
単位選択: Fs, fp/fs を Hz / kHz / MHz から選択可能
-
Bode 表示: ゲイン/位相の周波数軸を log/lin 切替
-
位相表示: ラップ (±180°) / アンラップ切替
-
過渡応答: インパルス応答及びステップ応答から選択でき、表示時間(ms)を任意指定
-
カーソル&ツールチップ: マウス位置の f(または t) と |H| / ∠H / h を即時表示。縦線/横線のカーソルラインを描画
-
C言語配列出力:
- FIR:
static const float fir_taps[N](float32) - IIR(SOS):
static const float iir_sos[sec][6](各行{b0,b1,b2,1,a1,a2}) - CMSIS-DSP 互換:
static const float biquad_coeffs[5*sec] = {b0,b1,b2,-a1,-a2,...}
- FIR:
-
クリップボードにサマリと配列を一括コピー
- Python 3.10+ 推奨
- 主要依存:
numpy,scipy,matplotlib,PySide6
pip install numpy scipy matplotlib PySide6- リポジトリを取得
- 依存をインストール(上記参照)
- アプリ起動
- 左ペインで仕様を設定し、[設計する] を押す
- 右ペインに ゲイン[dB] / 位相[deg] / 過渡応答 が表示されます
- 下部テキストに C配列 と設計サマリが出力されます([C配列をコピー] でクリップボードへ)
- FIR (Kaiser): 線形位相。阻止域減衰 As と遷移帯域幅からタップ数を推定します
- IIR (Chebyshev II, SOS): Stopband に等リプル。SOS 表現で安定性良好
- ローパス / ハイパス: fp(通過域端), fs(阻止域端)
- バンドパス: fp1, fp2, fs1, fs2 関係: fs1 < fp1 < fp2 < fs2
- Fs および各境界周波数の右側で選択可能。内部では自動的に Hz に換算して設計します
- 阻止域減衰 As [dB]: FIR の β/タップ数推定、IIR の
cheb2ord/cheby2に利用 - 通過域リプル Ap [dB]: IIR のみ(
cheb2ordの gpass) - FIRオプション: 最大タップ数、奇数タップ強制(推奨)
- 過渡応答表示時間: ms 指定
- 周波数軸: log/linear 切替
- 位相表示: ラップ or アンラップ
- マウス移動で ツールチップ(f/t と Y 値)表示
- 同時に 縦線/横線のカーソルラインを描画(グラフ外に出ると自動で非表示)
// FIR taps (float32), length = N
static const float fir_taps[N] = {
/* 係数 ... */
};
firwinにより線形位相の係数を生成。既定で 奇数タップ。
// IIR SOS (float32) SはIIRフィルタの段数
static const float iir_sos[S][6] = {
// {b0, b1, b2, 1.0, a1, a2} (a0正規化済み)
};// arm_biquad_cascade_df1_f32 用
static const float biquad_coeffs[5*S] = {
// per section: b0, b1, b2, -a1, -a2
};
// ワークバッファ例: float biquad_state[4*S] = {0};- 近似式:
$N \approx \frac{A_s - 8}{2.285,\Delta\omega} + 1$ ($\Delta\omega = 2\pi,\Delta f/\mathrm{Fs}$ ) - β 推定: 21 dB 以下 → 0、50 dB 以下 →
0.5842(A-21)^0.4 + 0.07886(A-21)、それ以外 →0.1102(A-8.7)
cheb2ord(wp, ws, gpass=A_p, gstop=A_s)で次数・境界を推定し、cheby2(..., output='sos')で実数 SOS に展開- SciPy の規約で周波数は ナイキスト正規化 (Hz→
/ (Fs/2)) を使用
- 極端に狭い遷移帯域では FIR タップ数が非常に大きくなります(上限: 16385)。
- IIR は Stopband 等リプルで、通過域は単調だが 位相は非線形です。
- 係数は
float32で C 配列化。固定小数点(Qフォーマット)は未実装。 - グラフの画像保存や係数の
.h/.csvへのファイル保存は未実装(今後対応予定)。
-
ModuleNotFoundError: 依存をインストールしてくださいpip install numpy scipy matplotlib PySide6
-
単一ファイル:
digital_filter_designer.py -
主要依存 API:
- SciPy:
firwin,cheb2ord,cheby2,freqz,sosfreqz,lfilter - Matplotlib QtAgg: 埋め込みキャンバス
- PySide6: Qt Widgets
- SciPy:
PR / Issue 歓迎です!
本プロジェクトのexe化にはNuitkaを推奨しております。 まずNuitkaをインストールします。
pip install nuitka以下のコマンドでexe化を実行してください
nuitka digital_filter_designer.py --enable-plugin=pyside6 --standalone --windows-console-mode=disable --follow-imports- SciPy / NumPy / Matplotlib / Qt の各コミュニティに感謝します。