上一篇介绍了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性能进行滤波器参数的调整。