gndless_filter
Shift-based first-order LPF/HPF filters (1:1 rate) for Veryl.
| Version | 0.3.2 |
|---|---|
| Repository | https://github.com/AkiyukiOkayasu/gndless-filter-veryl |
| License | MIT OR Apache-2.0 |
Modules
| HpfShiftSigned | ビットシフトによる一次ハイパスフィルタ (符号付き版)。 |
|---|---|
| HpfShiftUnsigned | ビットシフトによる一次ハイパスフィルタ (符号なし版)。 |
| HpfShiftVariableSigned | 可変シフト量に対応したHPF (符号付き版)。 |
| HpfShiftVariableUnsigned | 可変シフト量に対応したHPF (符号なし版)。 |
| LpfShiftSigned | ビットシフトによる一次ローパスフィルタ (指数移動平均、符号付き版) |
| LpfShiftUnsigned | ビットシフトによる一次ローパスフィルタ (符号なし版) |
| LpfShiftVariableSigned | 可変シフト量に対応したLPF (符号付き版) |
| LpfShiftVariableUnsigned | 可変シフト量に対応したLPF (符号なし版) |
| SoftFade::<FORMAT> | dutyディザによる線形フェードイン(ソフトミュート)モジュール |
Modules
| HpfShiftSigned | ビットシフトによる一次ハイパスフィルタ (符号付き版)。 |
|---|---|
| HpfShiftUnsigned | ビットシフトによる一次ハイパスフィルタ (符号なし版)。 |
| HpfShiftVariableSigned | 可変シフト量に対応したHPF (符号付き版)。 |
| HpfShiftVariableUnsigned | 可変シフト量に対応したHPF (符号なし版)。 |
| LpfShiftSigned | ビットシフトによる一次ローパスフィルタ (指数移動平均、符号付き版) |
| LpfShiftUnsigned | ビットシフトによる一次ローパスフィルタ (符号なし版) |
| LpfShiftVariableSigned | 可変シフト量に対応したLPF (符号付き版) |
| LpfShiftVariableUnsigned | 可変シフト量に対応したLPF (符号なし版) |
| SoftFade::<FORMAT> | dutyディザによる線形フェードイン(ソフトミュート)モジュール |
HpfShiftSigned
ビットシフトによる一次ハイパスフィルタ (符号付き版)。 LPFの出力を入力から減算してHPFを構成: y[n] = x[n] - lpf[n]。 内部でLpfShiftSignedをインスタンスして使用する。 x - lpf_out が出力幅を超える場合はsigned範囲へ飽和する。
カットオフ周波数の近似: fc ≈ fs / (2π * 2^SHIFT)。 例: fs=48kHz, SHIFT=8 → fc ≈ 30Hz。
SHIFT値が大きいほどカットオフ周波数が低くなり、より多くの低域を通過させる
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| SHIFT | u32 | シフト量 (1以上)。大きいほど低いカットオフ周波数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| x | input | signedlogic<DATA_WIDTH> | 入力サンプル (符号付き) |
| y | output | signedlogic<DATA_WIDTH> | フィルタ出力 (符号付き) |
HpfShiftUnsigned
ビットシフトによる一次ハイパスフィルタ (符号なし版)。 LPFの出力を入力から減算してHPFを構成: y[n] = x[n] - lpf[n]。 内部でLpfShiftUnsignedをインスタンスして使用する。
カットオフ周波数の近似: fc ≈ fs / (2π * 2^SHIFT)。
注意: x < lpf_outの場合、出力はラップアラウンド
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| SHIFT | u32 | シフト量 (1以上)。大きいほど低いカットオフ周波数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| x | input | logic<DATA_WIDTH> | 入力サンプル (符号なし) |
| y | output | logic<DATA_WIDTH> | フィルタ出力 (符号なし) |
HpfShiftVariableSigned
可変シフト量に対応したHPF (符号付き版)。 実行時にシフト量を変更できる。 x - lpf_out が出力幅を超える場合はsigned範囲へ飽和する。
伝達関数: y[n] = x[n] - lpf[n]。 ここで lpf[n] = lpf[n-1] + (x[n] - lpf[n-1]) >> shift。
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| MAX_SHIFT | u32 | 最大シフト量 |
| SHIFT_BITS | u32 | シフト量を表現するビット数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| shift | input | logic<SHIFT_BITS> | シフト量 (1 ~ MAX_SHIFT) |
| x | input | signedlogic<DATA_WIDTH> | 入力サンプル (符号付き) |
| y | output | signedlogic<DATA_WIDTH> | フィルタ出力 (符号付き) |
HpfShiftVariableUnsigned
可変シフト量に対応したHPF (符号なし版)。 実行時にシフト量を変更できる。
伝達関数: y[n] = x[n] - lpf[n]。 ここで lpf[n] = lpf[n-1] + (x[n] - lpf[n-1]) >> shift。
注意: x < lpf_outの場合、出力はラップアラウンド
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| MAX_SHIFT | u32 | 最大シフト量 |
| SHIFT_BITS | u32 | シフト量を表現するビット数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| shift | input | logic<SHIFT_BITS> | シフト量 (1 ~ MAX_SHIFT) |
| x | input | logic<DATA_WIDTH> | 入力サンプル (符号なし) |
| y | output | logic<DATA_WIDTH> | フィルタ出力 (符号なし) |
LpfShiftSigned
ビットシフトによる一次ローパスフィルタ (指数移動平均、符号付き版) 乗算器を使用せず、シフト演算のみで実装
伝達関数: y[n] = y[n-1] + (x[n] - y[n-1]) >> SHIFT
カットオフ周波数の近似: fc ≈ fs / (2π * 2^SHIFT) 例: fs=48kHz, SHIFT=8 → fc ≈ 30Hz
SHIFT値が大きいほどカットオフ周波数が低くなり、より滑らかに補間される。 SHIFTはDATA_WIDTHより大きくても問題ない。
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| SHIFT | u32 | シフト量 (1以上)。大きいほど低いカットオフ周波数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| x | input | signedlogic<DATA_WIDTH> | 入力サンプル (符号付き) |
| y | output | signedlogic<DATA_WIDTH> | フィルタ出力 (符号付き) |
LpfShiftUnsigned
ビットシフトによる一次ローパスフィルタ (符号なし版) 乗算器を使用せず、シフト演算のみで実装
伝達関数: y[n] = y[n-1] + (x[n] - y[n-1]) >> SHIFT
カットオフ周波数の近似: fc ≈ fs / (2π * 2^SHIFT) 例: fs=48kHz, SHIFT=8 → fc ≈ 30Hz
SHIFT値が大きいほどカットオフ周波数が低くなり、より滑らかに補間される。 SHIFTはDATA_WIDTHより大きくても問題ない。
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| SHIFT | u32 | シフト量 (1以上)。大きいほど低いカットオフ周波数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| x | input | logic<DATA_WIDTH> | 入力サンプル (符号なし) |
| y | output | logic<DATA_WIDTH> | フィルタ出力 (符号なし) |
LpfShiftVariableSigned
可変シフト量に対応したLPF (符号付き版) 実行時にシフト量を変更可能
伝達関数: y[n] = y[n-1] + (x[n] - y[n-1]) >> shift
MAX_SHIFTはDATA_WIDTHより大きくても問題ない。
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| MAX_SHIFT | u32 | 最大シフト量 |
| SHIFT_BITS | u32 | シフト量を表現するビット数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| shift | input | logic<SHIFT_BITS> | シフト量 (1 ~ MAX_SHIFT) |
| x | input | signedlogic<DATA_WIDTH> | 入力サンプル (符号付き) |
| y | output | signedlogic<DATA_WIDTH> | フィルタ出力 (符号付き) |
LpfShiftVariableUnsigned
可変シフト量に対応したLPF (符号なし版) 実行時にシフト量を変更可能
伝達関数: y[n] = y[n-1] + (x[n] - y[n-1]) >> shift
MAX_SHIFTはDATA_WIDTHより大きくても問題ない。
Parameters
| DATA_WIDTH | u32 | 入出力データ幅 |
|---|---|---|
| MAX_SHIFT | u32 | 最大シフト量 |
| SHIFT_BITS | u32 | シフト量を表現するビット数 |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット (出力を0に初期化) |
| enable | input | bbool | イネーブル信号 (trueでフィルタ更新) |
| shift | input | logic<SHIFT_BITS> | シフト量 (1 ~ MAX_SHIFT) |
| x | input | logic<DATA_WIDTH> | 入力サンプル (符号なし) |
| y | output | logic<DATA_WIDTH> | フィルタ出力 (符号なし) |
SoftFade::<FORMAT>
dutyディザによる線形フェードイン(ソフトミュート)モジュール
fade_inがLowの間は出力を0に保持する。
Highへ立ち上げると、窓内位置fade_posがduty(fade_duty)未満の間だけ入力を通過させ、平均ゲインをduty/窓で線形に0→1へ増加させる。
乗算器を使わないためDSP資源を消費しない。
通過/遮断のトグル周波数は clk/WINDOW で、PWMノイズは帯域外になる。
フェード時間は WINDOW * WINDOW / FADE_STEP クロック。
例: clk=50MHz, WINDOW=1024, FADE_STEP=2 → 約10.5ms。
CHANNELSとWINDOWは1以上、FADE_STEPは1以上を指定する。
Generic Parameters
| FORMAT | SignedFixedPointFormat |
|---|
Parameters
| CHANNELS | u32 | チャンネル数 (1以上) |
|---|---|---|
| WINDOW | u32 | ディザ窓長(クロック、1以上)。トグル周波数 = clk/WINDOW |
| FADE_STEP | u32 | 窓あたりのduty増分 (1以上)。duty最大はWINDOW |
Ports
| clk | input | clock | システムクロック |
|---|---|---|---|
| rst | input | reset | リセット |
| fade_in | input | bbool | フェード制御 (Lowで出力0、Highでフェードイン) |
| x | modport | FixedPointValue input_port [CHANNELS] | 入力 |
| y | modport | FixedPointValue output_port [CHANNELS] | 出力 |