gndless_sample_rate_conversion
Synchronous and asynchronous sample-rate converters for Veryl.
| Version | 0.1.0 |
|---|---|
| Repository | https://github.com/AkiyukiOkayasu/gndless-sample-rate-conversion-veryl |
| License | MIT OR Apache-2.0 |
Modules
| ContinuousLinearAsrc | FIFOから入力窓を補充しながら、50MHzの全クロックで線形補間値を出力するASRC |
|---|---|
| CubicLagrangeAsrc | 4サンプル窓のCubic補間を使うASRC |
| FourXHalfbandAsrc | 2段のhalfband補間と連続線形ASRCを接続した1ch 4倍オーバーサンプラ |
| LinearAsrc | 入力サンプル列を線形補間して、分数比のoutput tickへ変換するASRC |
| SampleRateTracker | 入力サンプルの到着周期測定と低域通過周期推定値の出力 |
Modules
| ContinuousLinearAsrc | FIFOから入力窓を補充しながら、50MHzの全クロックで線形補間値を出力するASRC |
|---|---|
| CubicLagrangeAsrc | 4サンプル窓のCubic補間を使うASRC |
| FourXHalfbandAsrc | 2段のhalfband補間と連続線形ASRCを接続した1ch 4倍オーバーサンプラ |
| LinearAsrc | 入力サンプル列を線形補間して、分数比のoutput tickへ変換するASRC |
| SampleRateTracker | 入力サンプルの到着周期測定と低域通過周期推定値の出力 |
ContinuousLinearAsrc
FIFOから入力窓を補充しながら、50MHzの全クロックで線形補間値を出力するASRC
phaseとadvanceはgndless_nco::FractionalPhaseAccumulatorから受け取る。
phaseが現在の入力サンプルから次の入力サンプルへ進む割合を表し、advanceが次のクロックで窓を1サンプル進めることを表す。
起動時に2サンプルの補間窓と、STARTUP_LEVEL以上の未消費FIFOが揃うまではoutput_activeをfalseにして0を出力する。burst入力ではこの値を大きくして、出力開始前にFIFOへ余裕を持たせる。
動作開始後は、入力不足をunderflowへstickyに記録しながら出力を止めない。
Parameters
| SAMPLE_WIDTH | u32 | 入出力サンプルの符号付きビット幅 |
|---|---|---|
| PHASE_WIDTH | u32 | 位相入力のビット幅 |
| INPUT_DEPTH | u32 | 入力FIFOの深さ |
| STARTUP_LEVEL | u32 | 出力開始に必要な未消費FIFOワード数 |
Ports
| clk | input | clock | システムクロック | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||||||||||||||
| input_valid | input | bbool | 入力サンプル有効 | ||||||||||||||||||||||||
| input_ready | output | bbool | 入力受理可能 | ||||||||||||||||||||||||
| input_sample | input | signedlogic| 入力サンプル
|
input_level |
output |
logic<$clog2(INPUT_DEPTH+1)> |
入力FIFOのワード数
|
phase |
input |
logic | 補間位相
|
advance |
input |
bbool |
次の入力サンプルへ窓を進める要求
|
output_active |
output |
bbool |
連続出力が有効
|
output_sample |
output |
signedlogic | 補間後の出力サンプル
|
underflow |
output |
bbool |
入力不足のstickyフラグ
|
|
CubicLagrangeAsrc
4サンプル窓のCubic補間を使うASRC
初期化時に4サンプルを受け取り、出力tickごとに分数位相を進める。
ratioが整数部Nを持つ場合は、窓をNサンプル進めて不足分をFIFOから補充する。Cubic補間のため、最初の出力は初期窓の2番目のsample位置になる。
Parameters
| SAMPLE_WIDTH | u32 | 入出力サンプルの符号付きビット幅 |
|---|---|---|
| PHASE_WIDTH | u32 | `ratio`の小数部ビット幅 |
| INPUT_DEPTH | u32 | 入力FIFOの深さ |
Ports
| clk | input | clock | システムクロック | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||||||||||
| input_valid | input | logic | 入力サンプル有効 | ||||||||||||||||||||
| input_ready | output | logic | 入力受理可能 | ||||||||||||||||||||
| input_sample | input | signedlogic| 入力サンプル
|
output_tick |
input |
logic |
出力生成要求
|
output_ready |
output |
logic |
出力窓が準備済み
|
output_valid |
output |
logic |
出力サンプル有効
|
output_sample |
output |
signedlogic | 補間後の出力サンプル
|
ratio |
input |
logic | 出力1回あたりの入力進行量
|
|
FourXHalfbandAsrc
2段のhalfband補間と連続線形ASRCを接続した1ch 4倍オーバーサンプラ
入力1サンプルから論理的に4サンプルを生成し、後段のSTD FIFOへburstで受け渡す。FIFOの読み出しと50MHz出力の位相進行はContinuousLinearAsrcが担当するため、HBF自身は入力受理と2サンプルburstのready/validだけを扱う。
input → Halfband 2x (stage 1) → Halfband 2x (stage 2)
→ 4-sample burst → FIFO → continuous linear ASRC → output
HBFのburstでFIFOをSTARTUP_LEVELまで満たしてからoutput_activeになる。
以後は毎クロック補間値を出し、advance時だけFIFOから次の窓を補充する。
Parameters
| SAMPLE_WIDTH | u32 | 入出力サンプルの符号付きビット幅 |
|---|---|---|
| PHASE_WIDTH | u32 | 位相入力のビット幅 |
| INPUT_DEPTH | u32 | 出力側入力FIFOの深さ |
Ports
| clk | input | clock | システムクロック | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||||||||||
| input_valid | input | bbool | 入力サンプル有効 | ||||||||||||||||||||
| input_ready | output | bbool | 入力受理可能 | ||||||||||||||||||||
| input_sample | input | signedlogic| 入力サンプル
|
phase_increment |
input |
logic | 毎クロックの位相増分
|
output_active |
output |
bbool |
連続出力が有効
|
output_sample |
output |
signedlogic | 補間後の出力サンプル
|
input_level |
output |
logic<$clog2(INPUT_DEPTH+1)> |
入力FIFOのワード数
|
underflow |
output |
bbool |
入力不足のstickyフラグ
|
|
LinearAsrc
入力サンプル列を線形補間して、分数比のoutput tickへ変換するASRC
入力はinput_valid && input_readyで受け付け、内部のVeryl STD FIFOへ一時保持する。ratioは「output 1回あたりに進む入力サンプル数」をQ(整数3bit).PHASE_WIDTHで表す。
例えば96kHz入力から48kHzを作る場合は2 << PHASE_WIDTH、96kHz入力から44.1kHzを作る場合は96_000 / 44_100 << PHASE_WIDTH相当を設定する。
起動時はFIFOから2サンプル窓を作るまでoutput_readyがLowになる。
output_tick && output_readyで出力し、位相進行が入力境界を越えた場合は必要数だけFIFOから窓を補充する。補充中のoutput_tickは受理されない。
Parameters
| SAMPLE_WIDTH | u32 | 入出力サンプルの符号付きビット幅 |
|---|---|---|
| PHASE_WIDTH | u32 | `ratio`の小数部ビット幅 |
| INPUT_DEPTH | u32 | 入力FIFOの深さ |
Ports
| clk | input | clock | システムクロック | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||||||||||
| input_valid | input | logic | 入力サンプル有効 | ||||||||||||||||||||
| input_ready | output | logic | 入力受理可能 | ||||||||||||||||||||
| input_sample | input | signedlogic| 入力サンプル
|
output_tick |
input |
logic |
出力生成要求
|
output_ready |
output |
logic |
出力窓が準備済み
|
output_valid |
output |
logic |
出力サンプル有効
|
output_sample |
output |
signedlogic | 補間後の出力サンプル
|
ratio |
input |
logic | 出力1回あたりの入力進行量
|
|
SampleRateTracker
入力サンプルの到着周期測定と低域通過周期推定値の出力
このモジュールはASRC全体ではない。sample_validの時刻列から、生の周期と平滑化した周期を作るだけに責務を限定する。
位相累積、補間、FIFOレベル制御は後段のモジュールで行う。
FILTER_SHIFTが大きいほど追従は遅くなるが、valid時刻の量子化やサンプル間ジッターを位相増分へ伝えにくくなる。
filtered_periodはPERIOD_WIDTH.FRACTION_WIDTHの固定小数点値である。
最初のsample_validは基準時刻を記録するだけで、次の到着からmeasured_periodを更新してperiod_validを1クロックだけHighにする。
有効な測定がLOCK_COUNT回に達するとlockedを保持する。
Parameters
| PERIOD_WIDTH | u32 | 整数周期のビット幅 |
|---|---|---|
| FRACTION_WIDTH | u32 | 平滑化周期の小数部ビット幅 |
| FILTER_SHIFT | u32 | 周期平滑化の右シフト量 |
| LOCK_COUNT | u32 | lock判定に必要な有効測定回数 |
Ports
| clk | input | clock | システムクロック | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||
| sample_valid | input | bbool | 入力サンプル到着パルス | ||||||||||||
| measured_period | output | logic| 測定した整数周期
|
period_valid |
output |
bbool |
周期更新パルス
|
filtered_period |
output |
logic | 平滑化した固定小数点周期
|
locked |
output |
bbool |
lock状態
|
|