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.2.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
PhaseIncrementEstimator サンプル到着周期からASRC用の位相増分を生成する推定器
SampleRateTracker 入力サンプルの到着周期測定と低域通過周期推定値の出力
TwoXHalfbandAsrc 1段のhalfband補間と連続線形ASRCを接続した1ch 2倍オーバーサンプラ。

Modules


ContinuousLinearAsrc FIFOから入力窓を補充しながら、50MHzの全クロックで線形補間値を出力するASRC
CubicLagrangeAsrc 4サンプル窓のCubic補間を使うASRC
FourXHalfbandAsrc 2段のhalfband補間と連続線形ASRCを接続した1ch 4倍オーバーサンプラ
LinearAsrc 入力サンプル列を線形補間して、分数比のoutput tickへ変換するASRC
PhaseIncrementEstimator サンプル到着周期からASRC用の位相増分を生成する推定器
SampleRateTracker 入力サンプルの到着周期測定と低域通過周期推定値の出力
TwoXHalfbandAsrc 1段のhalfband補間と連続線形ASRCを接続した1ch 2倍オーバーサンプラ。

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回あたりの入力進行量

PhaseIncrementEstimator

サンプル到着周期からASRC用の位相増分を生成する推定器

SampleRateTrackerで平滑化した入力サンプル周期から、システムクロックあたりの入力位相進行量を求める。 phase_incrementはQ0.PHASE_WIDTHで、値が1.0未満となるサンプルレート比で使用する。 RATE_MULTIPLIER_SHIFTを2にすると、4倍オーバーサンプリング経路用の位相増分を生成できる。 除算は逐次演算で行い、入力サンプル周期より短いDIVIDEND_WIDTHクロックで完了する必要がある。 除算中に新しい周期を観測した場合は最新の周期を保持し、現在の除算完了後に再計算する。 TIMEOUT_PERIODを有効にすると、入力停止時は古い位相増分を無効化して新しい到着列を再測定する。

Parameters


PERIOD_WIDTH u32 サンプル周期の整数部ビット幅
PERIOD_FRACTION u32 平滑化周期の小数部ビット幅
PHASE_WIDTH u32 位相増分の小数部ビット幅
FILTER_SHIFT u32 周期平滑化IIRの右シフト量
LOCK_COUNT u32 位相増分の計算を始める測定回数
RATE_MULTIPLIER_SHIFT u32 位相増分に掛ける2のべき乗倍率のシフト量
STEP_THRESHOLD_SHIFT u32 即時追従する周期差の比率を表す右シフト量、0で無効
TIMEOUT_PERIOD u32 入力停止とみなすクロック数、0で無効

Ports


clk input clock システムクロック
rst input reset 同期リセット
sample_valid input bbool 入力サンプル到着パルス
phase_increment output logic ASRC用Q0位相増分
locked output bbool 位相増分が有効
range_error output bbool 位相増分が1.0以上となる設定または入力を検出

SampleRateTracker

入力サンプルの到着周期測定と低域通過周期推定値の出力

このモジュールはASRC全体ではない。sample_validの時刻列から、生の周期と平滑化した周期を作るだけに責務を限定する。 位相累積、補間、FIFOレベル制御は後段のモジュールで行う。

FILTER_SHIFTが大きいほど追従は遅くなるが、valid時刻の量子化やサンプル間ジッターを位相増分へ伝えにくくなる。 STEP_THRESHOLD_SHIFTを有効にすると、平滑化周期との差がその2のべき乗分の1以上となった周期変更は即時に取り込む。 TIMEOUT_PERIODを有効にすると、入力停止時にlockを解除して次の入力から測定をやり直す。 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判定に必要な有効測定回数
STEP_THRESHOLD_SHIFT u32 即時追従する周期差の比率を表す右シフト量、0で無効
TIMEOUT_PERIOD u32 入力停止とみなすクロック数、0で無効

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状態
timed_out output bbool 入力停止によるlock解除パルス

TwoXHalfbandAsrc

1段のhalfband補間と連続線形ASRCを接続した1ch 2倍オーバーサンプラ。

phase_incrementは入力サンプルレートを基準にしたQ0.PHASE_WIDTH値で受け取る。 halfbandで入力を2倍へ補間してからFIFOへ格納するため、内部のNCOには位相増分を 2倍して渡す。呼び出し側の推定器は48/44.1kHzなど元のADATレートの増分をそのまま 接続できる。

input → Halfband 2x (COEFFICIENT_SET=1)
      → 2-sample burst → FIFO → continuous linear ASRC → output

HBFはナイキスト付近のスペクトルイメージ成分を抑えるため、短いset2ではなくset1を使う。 STARTUP_LEVELまでFIFOを満たしてから出力を開始し、入力欠落はunderflowへ stickyに記録する。

Parameters


SAMPLE_WIDTH u32 入出力サンプルの符号付きビット幅
PHASE_WIDTH u32 入力レート基準の位相増分幅
INPUT_DEPTH u32 線形ASRC FIFOの深さ

Ports


clk input clock システムクロック
rst input reset リセット
input_valid input bbool 入力サンプル有効
input_ready output bbool 入力受理可能
input_sample input signedlogic 入力サンプル
phase_increment input logic 入力レート基準のQ0位相増分
output_active output bbool 連続出力が有効
output_sample output signedlogic 補間後の出力サンプル
input_level output logic<$clog2(INPUT_DEPTH+1)> ASRC FIFOのワード数
underflow output bbool 入力不足のstickyフラグ

Module Prototypes


Interfaces


Packages