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