💡 私の卒業研究のテーマは多周波数点デジタルアップコンバータであり、まず DUC のシミュレーションを行いました。目標は、48k サンプリングレートの音声信号を 28 倍の補間で 6.144M のサンプリングレートに変換し、AM 変調を行って送信することです。
Matlab シミュレーション#
基本パラメータ生成#
%% base data gen
fs_base=48e3; % 入力DUCのサンプリングレート
upsample_L=128;
fs_duc=fs_base*upsample_L; % 出力DUCのサンプリングレート
Fc=5e6; % キャリア周波数
Fpass=20e3; % AMベースバンド幅
Fstop=30e3; % 停止帯
Ap=0.1; % 通過帯リップル
Ast=60; % 停止帯減衰
T = 1; % 持続時間
t = 0:1/fs_base:T-1/fs_base;% 時間ベクトル
outputframe=1;
N1_cycle = 128;
N2_cycle = 64;
N3_cycle = 32;
N4_cycle = 16;
システム全体のレートは 48k×128=6.144M であり、イネーブル信号を使用してサンプリングレートを変換します。信号出力はストリーム出力で、フレームサイズは 1 です。
第一级 低通 FIR 補間フィルタ#
%% First Lowpass Fir Interpolator
lowpassParams.FsIn=fs_base;
lowpassParams.InterpolationFactor = 2;
lowpassParams.FsOut=lowpassParams.FsIn*lowpassParams.InterpolationFactor;
lowpassSpec = fdesign.interpolator(lowpassParams.InterpolationFactor, ...
'lowpass','Fp,Fst,Ap,Ast',Fpass,Fstop,Ap,Ast,lowpassParams.FsOut);
lowpassFilt = design(lowpassSpec,'SystemObject',true)
入力信号のサンプリングレートはベースバンドレートであり、出力信号のサンプリングレートはベースバンドレート × 補間因子です。fdesign.interpolator を使用してフィルタ係数を設計し、フィルタの振幅周波数応答は以下の通りです:
第二级 低通ハーフバンド補間フィルタ#
%%
% *Second Halfband Interpolator*
%
% ハーフバンドフィルタは、2倍の効率的な補間を提供します。ハーフバンド
% フィルタは、係数の約半分がゼロに等しいため、ハードウェアにとって効率的です。
% そのため、これらの乗算器はハードウェア実装から除外されます。
hbParams.FsIn = lowpassParams.FsOut;
hbParams.InterpolationFactor = 2;
hbParams.FsOut = lowpassParams.FsOut*hbParams.InterpolationFactor;
hbParams.TransitionWidth = hbParams.FsIn - 2*Fstop; % 通過帯、補間後のスペクトルは入力信号のサンプリングレートに基づいて周期的に拡張されます
% 2倍のFstopを減算することで、補間後に保持される信号帯域幅が混叠を引き起こさないことを保証し、十分な減衰を確保します
hbParams.StopbandAttenuation = Ast;
hbSpec = fdesign.interpolator(hbParams.InterpolationFactor,'halfband', ...
'TW,Ast', ...
hbParams.TransitionWidth, ...
hbParams.StopbandAttenuation, ...
hbParams.FsOut);
hbFilt = design(hbSpec,'SystemObject',true)
ハーフバンドフィルタの通過帯は、入力信号のサンプリングレートから 2 倍のカットオフ周波数を引いたものであり、補間後に生成されるスペクトル拡張の帯域がフィルタリングされ、混叠が引き起こされないことを保証し、十分な減衰を確保します。
ハーフバンドフィルタの振幅周波数応答および二段階フィルタの連結応答は以下の通りです:
第三级 CIC 補償フィルタ#
CIC 補間フィルタの通過帯が平坦でないため、補償フィルタを追加します。
% *CIC Compensation Interpolator*
%
% 最後のCICフィルタの振幅応答は、通過帯域内で顕著な
% _ドロップ_を持つため、この例ではFIRベースのドロップ
% 補償フィルタを使用して通過帯域応答を平坦化します。ドロップ
% 補償器はCIC補間器と同じ特性を持ちます。このフィルタは
% 2倍の補間を実装しますので、フィルタの帯域制限特性も指定する必要があります。
% また、この補償フィルタおよび後のCIC補間器に使用されるCIC補間器の特性も指定します。
%
% |design|関数を使用して、指定された特性を持つフィルタシステムオブジェクトを返します。
compParams.FsIn = hbParams.FsOut;
compParams.InterpolationFactor = 2; % CIC補償補間因子
compParams.FsOut = compParams.FsIn*compParams.InterpolationFactor; % 新しいサンプリングレート
compParams.Fpass = 1/2*compParams.FsIn + Fpass; % CIC補償通過帯域周波数
compParams.Fstop = 1/2*compParams.FsIn + 1/4*compParams.FsIn; % CIC補償停止帯域周波数
compParams.Ap = Ap; % 全体フィルタと同じ通過帯域リップル
compParams.Ast = Ast; % 全体フィルタと同じ停止帯域減衰
N = 31; % 入力間の16サイクルを利用するための32タップフィルタ
cicParams.InterpolationFactor = 16; % CIC補間因子
cicParams.DifferentialDelay = 1; % CIC補間器の差動遅延
cicParams.NumSections = 4; % CIC補間器の積分器およびコンボセクションの数
compSpec = fdesign.interpolator(compParams.InterpolationFactor,'ciccomp', ...
cicParams.DifferentialDelay, ...
cicParams.NumSections, ...
cicParams.InterpolationFactor, ...
'N,Fp,Ap,Ast', ...
N,compParams.Fpass,compParams.Ap,compParams.Ast, ...
compParams.FsOut);
compFilt = design(compSpec,'SystemObject',true)
補償フィルタの通過帯域および停止帯域周波数の設定理由は以下の通りです:
compParams.Fpass = 1/2 * compParams.FsIn + Fpass
:
ここでの通過帯域周波数Fpass
の設定は、入力サンプリングレートcompParams.FsIn
に基づいています。CIC フィルタは通常、周波数応答の減衰がFsIn/2
から明確になるため、補償フィルタの通過帯域はFsIn/2 + Fpass
に設定され、これにより補償フィルタが CIC フィルタの通過帯域内のゲインを修正できることが保証されます。特に高周波部分において。compParams.Fstop = 1/2 * compParams.FsIn + 1/4 * compParams.FsIn
:
停止帯域周波数はFsIn/2 + 1/4 * FsIn
に設定されており、これは補間後に信号スペクトルの帯域外部分が十分に減衰され、混叠現象が発生しないことをさらに保証するためです。補間プロセスは入力信号のスペクトルを周期的に拡張するため、フィルタの停止帯域はこれらの拡張部分をカバーする必要があり、無駄な信号が除去されることを保証します。
補償フィルタの振幅周波数応答図は以下の通りです:
第四级 CIC 補間フィルタ#
%%
% *CIC Interpolator*
%
% 最後のフィルタ段はCIC補間器として実装されます。この
% タイプのフィルタは大きなデシメーション因子を効率的に実装する能力を持っています。
% CICフィルタの応答は移動平均フィルタのカスケードに似ていますが、CICフィルタは乗算や除算を使用しません。その結果、
% CICフィルタは大きなDCゲインを持ちます。
cicParams.InterpolationFactor = 16; % CIC補間因子
cicParams.DifferentialDelay = 1; % CIC補間器の差動遅延
cicParams.NumSections = 4; % CIC補間器の積分器およびコンボセクションの数
cicParams.FsIn = compParams.FsOut;
cicParams.FsOut = cicParams.FsIn*cicParams.InterpolationFactor;
cicFilt = dsp.CICInterpolator(cicParams.InterpolationFactor, ...
cicParams.DifferentialDelay,cicParams.NumSections)
前の三段階の二重補間フィルタを経て、CIC フィルタで 16 倍の補間を行うことで 128 倍の補間が完了します。振幅周波数応答は以下の通りです:
Simulink シミュレーション#
📌 カウンタを利用して異なるイネーブル信号を生成し、フィルタのサンプリングレートの変化を制御します。
DUC_Module#
NCO_system#
このモジュールはベースバンド信号を生成します。
スペクトル図は以下の通りです:
時域波形は以下の通りです:
LP_system#
信号に対して最初の二重補間を行い、処理後のスペクトル図は以下の通りです:
時域波形は以下の通りです:
スペクトル中の高周波部分が一部フィルタリングされ、時域上では 2 つのサンプル間に新しい値が挿入されていることがわかります。