Matlab定點化模擬的一個例子:使用CIC濾波器進行數字上變頻的模擬
阿新 • • 發佈:2019-01-06
上一篇介紹了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濾波器再解調:
這裡Sigdem()也是我編造的函式。double()函式可將fi定點化物件變回雙浮點數。這樣就完成了一個上變頻的定點化模擬,我們可以檢視EVM效能進行濾波器引數的調整。%% 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