Sawen Moerjie

Sawen_Blog

一个普通的传媒工科牲的博客
follow

数字上変頻シミュレーション設計

💡 私の卒業研究のテーマは多周波数デジタルアップコンバータですので、まず DUC のシミュレーションを行いました。目標は、48k サンプリングレートの音声信号を 28 倍の補間で 6.144M のサンプリングレートにし、AM 変調を施して送信することです。

1727092880561.png

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 を使用してフィルタ係数を設計し、フィルタの振幅周波数応答は以下の通りです:

2024after4202409232006541.bmp

第二级 低通ハーフバンド補間フィルタ#

%%
% *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 倍のカットオフ周波数を引いたもので、補間後に生成される周波数スペクトルの帯域がフィルタリングされ、混叠が引き起こされないようにし、十分な減衰を保証します。

ハーフバンドフィルタの振幅周波数応答と 2 段フィルタの連結応答は以下の通りです:

2024after4202409232026049.svg

第三级 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に設定されており、これは補間後に信号スペクトルの帯外部分が十分に減衰され、混叠現象が発生しないようにするためです。補間プロセスは入力信号のスペクトルを周期的に拡張するため、フィルタの停止帯域はこれらの拡張部分をカバーする必要があります。

補償フィルタの振幅周波数応答図は以下の通りです:

2024after4202409232027581.svg

第四级 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) 

前の 3 段階の 2 倍補間フィルタを経て、CIC フィルタで 16 倍補間を行うことで 128 倍の補間が完了します。振幅周波数応答は以下の通りです:

2024after4202409232033885.svg

2024after4202409232046477.png

カウンタを利用して異なるイネーブル信号を生成し、フィルタのサンプリングレートの変化を制御します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。