1. 程式人生 > >Matlab定點化模擬的一個例子:使用CIC濾波器進行數字上變頻的模擬

Matlab定點化模擬的一個例子:使用CIC濾波器進行數字上變頻的模擬

上一篇介紹了Matlab定點化的基本方法。

這裡介紹一個使用CIC濾波器及其補償濾波器進行24倍上變頻的例子:

首先對訊號源進行定點化,這裡Sigm()是我編造的函式,不是Matlab自帶的:

%% signal source
wave = Sigm();  % generate a signal
F = fimath('CastBeforeSum', 0, 'OverflowMode', 'Saturate', ...
            'RoundMode', 'round', 'ProductMode', 'SpecifyPrecision', 'SumMode', 'SpecifyPrecision', ...
            'ProductWordLength', 16, 'ProductFractionLength', 15, 'SumWordLength', 16, 'SumFractionLength', 15);
T = numerictype('Signed', true, 'WordLength', 16, 'FractionLength', 15);
WaveOut = fi(wave, T, F);

這裡定義了fimath物件和numerictype物件 ,然後使用fi將波形定點化。

fimath物件只要約束運算過程,其中:

OverflowMode指定了飽和溢位的處理方式,這裡選擇了Saturate模式,可以降低誤差。

RoundMode指定了捨棄多餘位的方式,round是四捨五入,如果是直接捨棄會產生高頻噪聲,所以我推薦使用round模式,但是會增加額外的資源消耗。

ProductMode和SumMode指定了乘法加法的精度設定模式,一般是自己指定。

後面就不解釋了,都是運算字長和小數位的設定。

numerictype物件指定了資料是否為有符號位,還有定點化後的字長和小數位。

%% filter design
dd  = 1;     % Differential delay.
fp  = 4.0e6;    % Passband of interest.
ast = 60;    % Minimum attenuation of alias components in passband.
fs  = 10e6;   % Sampling frequency for input signal.
l   = 24;    % Interpolation factor.
d   = fdesign.interpolator(l,'cic',dd,'fp,ast',fp,ast,l*fs);
hm = design(d);  %Use the default design method.
% fvtool(hm,'fs',l*fs);

nsecs = hm.NumberOfSections;%NumSections;
d = fdesign.ciccomp(dd,nsecs,...
fp,4.8e6,0.1,60,fs);
hmc = design(d,'equiripple');

hfvt = fvtool(hmc,hm,cascade(hmc,hm),'fs',[fs,l*fs,l*fs]);
legend(hfvt,'CIC Compensator','CIC Interpolator',...
'Overall Response');
%% get the parameter of filter
Hmc = dfilt.dffirt(hmc.Numerator);
set(Hmc, 'Arithmetic', 'fixed', ...
    'FilterInternals', 'SpecifyPrecision', ...
    'RoundMode', 'round', ...
    'InputFracLength', 15, ...
    'ProductWordLength', 31, ...
    'ProductFracLength', 30, ...
    'AccumWordLength', 32, ...
    'AccumFracLength', 30, ...
    'OutputWordLength', 16, ...
    'OutputFracLength', 14, ...
    'CoeffAutoScale', false, ...
    'OverflowMode', 'Saturate');
set(Hmc, 'CoeffWordLength', 16, 'NumFracLength', 14);

這裡先設定了CIC濾波器的引數,從而獲得CIC補償濾波器的引數,為了更好控制CIC補償濾波器的引數檢視頻率特性並把定點化的引數輸出給FPGA開發使用,這裡使用先將濾波器引數變成一個濾波器物件,然後設定字長和小數位,可以和波形的設定不同。

最後將波形依次經過補償濾波器和CIC濾波器再解調:

%% data upsample
% compensating filter
WaveComp = filter(Hmc, WaveOut);
% CIC
hsr = dsp.SignalSource( WaveComp, length(WaveComp) );
hcicint = dsp.CICInterpolator(l, 1, nsecs);
Tx = step( hcicint, step(hsr) );

%% data demodulate
Sigdem(double(Tx));  % demodulate
這裡Sigdem()也是我編造的函式。double()函式可將fi定點化物件變回雙浮點數。這樣就完成了一個上變頻的定點化模擬,我們可以檢視EVM效能進行濾波器引數的調整。