Veryl registryAkiyukiOkayasu/gndless-sample-rate-conversion-veryl · gndless_sample_rate_conversionSource ↗

Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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

phaseadvancegndless_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状態

Module Prototypes


Interfaces


Packages