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性能进行滤波器参数的调整。


你可能感兴趣的:(Matlab)