gndless_filter
Audio-rate CIC, halfband, and shift-based filters for Veryl.
| Version | 0.2.0 |
|---|---|
| Repository | https://github.com/AkiyukiOkayasu/gndless-filter-veryl |
| License | MIT OR Apache-2.0 |
Modules
| CicDecimator | CIC間引きフィルタ |
|---|---|
| CicInterpolator | CIC補間フィルタ |
| HalfbandInterpolator2x::<FORMAT> | format付きvalue interfaceを使う2倍halfband補間器 |
| HpfShiftSigned | ビットシフトによる一次ハイパスフィルタ (符号付き版)。 |
| HpfShiftUnsigned | ビットシフトによる一次ハイパスフィルタ (符号なし版)。 |
| HpfShiftVariableSigned | 可変シフト量に対応したHPF (符号付き版)。 |
| HpfShiftVariableUnsigned | 可変シフト量に対応したHPF (符号なし版)。 |
| LpfShiftSigned | ビットシフトによる一次ローパスフィルタ (指数移動平均、符号付き版) |
| LpfShiftUnsigned | ビットシフトによる一次ローパスフィルタ (符号なし版) |
| LpfShiftVariableSigned | 可変シフト量に対応したLPF (符号付き版) |
| LpfShiftVariableUnsigned | 可変シフト量に対応したLPF (符号なし版) |
Modules
| CicDecimator | CIC間引きフィルタ |
|---|---|
| CicInterpolator | CIC補間フィルタ |
| HalfbandInterpolator2x::<FORMAT> | format付きvalue interfaceを使う2倍halfband補間器 |
| HpfShiftSigned | ビットシフトによる一次ハイパスフィルタ (符号付き版)。 |
| HpfShiftUnsigned | ビットシフトによる一次ハイパスフィルタ (符号なし版)。 |
| HpfShiftVariableSigned | 可変シフト量に対応したHPF (符号付き版)。 |
| HpfShiftVariableUnsigned | 可変シフト量に対応したHPF (符号なし版)。 |
| LpfShiftSigned | ビットシフトによる一次ローパスフィルタ (指数移動平均、符号付き版) |
| LpfShiftUnsigned | ビットシフトによる一次ローパスフィルタ (符号なし版) |
| LpfShiftVariableSigned | 可変シフト量に対応したLPF (符号付き版) |
| LpfShiftVariableUnsigned | 可変シフト量に対応したLPF (符号なし版) |
CicDecimator
CIC間引きフィルタ
入力側でSTAGES段の積分器を毎input_valid時に更新し、DECIMATION個ごとにSTAGES段の櫛形フィルタを通して出力する。
出力にはCIC固有のゲイン DECIMATION^STAGES が含まれる。
Parameters
| INPUT_WIDTH | u32 | 入力サンプルのビット幅 |
|---|---|---|
| ACCUMULATOR_WIDTH | u32 | 積分器・出力のビット幅 |
| STAGES | u32 | 積分器と櫛形フィルタの段数 |
| DECIMATION | u32 | 間引き比 |
Ports
| clk | input | clock | システムクロック | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||
| input_valid | input | bbool | 入力サンプル有効 | ||||||||
| input_sample | input | signedlogic| 入力サンプル
|
output_valid |
output |
bbool |
出力サンプル有効
|
output_sample |
output |
signedlogic | 間引き後の出力サンプル
|
|
CicInterpolator
CIC補間フィルタ
入力サンプルをSTAGES段の櫛形フィルタへ通し、その結果をINTERPOLATION倍のゼロ挿入列としてSTAGES段の積分器へ入力する。
output_validは動作中、クロックごとにHighになる。
定常ゲインの補正は行わないため、倍率と段数に応じたスケーリングは利用側で行う。
通過帯域のdroop補正もこのモジュールの責務外とする。
1入力をinput_valid && input_readyで受理すると、INTERPOLATION個の出力を連続生成する。
burst最終cycleではinput_readyもHighとなるため、次入力を同時受理すればoutput_validを途切れさせず次burstへ移れる。
Parameters
| INPUT_WIDTH | u32 | 入力サンプルのビット幅 |
|---|---|---|
| ACCUMULATOR_WIDTH | u32 | 積分器・出力のビット幅 |
| STAGES | u32 | 積分器と櫛形フィルタの段数 |
| INTERPOLATION | u32 | 補間比 |
Ports
| clk | input | clock | システムクロック | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||
| input_valid | input | bbool | 入力サンプル有効 | ||||||||
| input_ready | output | logic | 入力受理可能 | ||||||||
| input_sample | input | signedlogic| 入力サンプル
|
output_valid |
output |
bbool |
出力サンプル有効
|
output_sample |
output |
signedlogic | 補間後の出力サンプル
|
|
HalfbandInterpolator2x::<FORMAT>
format付きvalue interfaceを使う2倍halfband補間器
FORMATはsample幅と小数部位置を一体で指定する。既定のQ2.23はASRC処理中の1bit headroomを確保し、係数Q2.16との最初の積を26x18に保つ
Generic Parameters
| FORMAT | gndless_fixedpoint SignedFixedPointFormat |
|---|
Parameters
| COEFFICIENT_SET | u32 | 使用する係数セット (1または2) |
|---|
Ports
| clk | input | clock | |
|---|---|---|---|
| rst | input | reset | |
| input_valid | input | bbool | |
| input_ready | output | bbool | |
| input_sample | modport | gndless_fixedpoint FixedPointValue input_port | |
| output_valid | output | bbool | |
| output_ready | input | bbool | |
| output_sample | modport | gndless_fixedpoint FixedPointValue output_port |
HpfShiftSigned
ビットシフトによる一次ハイパスフィルタ (符号付き版)。 LPFの出力を入力から減算してHPFを構成: y[n] = x[n] - lpf[n]。 内部でLpfShiftSignedをインスタンスして使用する。
カットオフ周波数の近似: 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| 入力サンプル (符号付き)
|
y |
output |
signedlogic | フィルタ出力 (符号付き)
|
|
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| 入力サンプル (符号なし)
|
y |
output |
logic | フィルタ出力 (符号なし)
|
|
HpfShiftVariableSigned
可変シフト量に対応したHPF (符号付き版)。 実行時にシフト量を変更できる。
伝達関数: 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| シフト量 (1 ~ MAX_SHIFT)
|
x |
input |
signedlogic | 入力サンプル (符号付き)
|
y |
output |
signedlogic | フィルタ出力 (符号付き)
|
|
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| シフト量 (1 ~ MAX_SHIFT)
|
x |
input |
logic | 入力サンプル (符号なし)
|
y |
output |
logic | フィルタ出力 (符号なし)
|
|
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| 入力サンプル (符号付き)
|
y |
output |
signedlogic | フィルタ出力 (符号付き)
|
|
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| 入力サンプル (符号なし)
|
y |
output |
logic | フィルタ出力 (符号なし)
|
|
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| シフト量 (1 ~ MAX_SHIFT)
|
x |
input |
signedlogic | 入力サンプル (符号付き)
|
y |
output |
signedlogic | フィルタ出力 (符号付き)
|
|
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| シフト量 (1 ~ MAX_SHIFT)
|
x |
input |
logic | 入力サンプル (符号なし)
|
y |
output |
logic | フィルタ出力 (符号なし)
|
|