谁会用matlab设计一个CIC滤波器,要有完整的程序,谢谢了

谁会用matlab设计一个CIC滤波器,要有完整的程序,谢谢了,第1张

CIC抽取补偿滤波器设计,CIC滤波器采用5阶8倍抽取

如下:

%

%THIS IS A WIZARD GENERATED FILE. DO NOT EDIT THIS FILE!

%

%---------------------------------------------------------------------------------------------------------

%This is a filter withfixed coefficients

%This Model Only Support Single Channel Input Data.

%Please input:

%data vector: stimulation(1:n)

%

%This Model Only Support FIR_WIDTH to 51 Bits

%

%FILTER PARAMETER

%Input Data Type: Signed

%Input Data Width: 13

%FIR Width (Full Calculation Width Before Output Width Adjust) : 23

%-----------------------------------------------------------------------------------------------------------

%MegaWizard Scaled Coefficient Values

function output = CIC8_fir_comp_mlab_mat (stimulation, output)

coef_matrix=[0 0 1 0 -2 -3 0 7 10 1 -17 -26 -5 46 102 127 102 46 -5 -26 -17 1 10 7 0 -3 -2 0 1 0 0 ]

INTER_FACTOR = 1

DECI_FACTOR = 1

MSB_RM = 0

MSB_TYPE = 0

LSB_RM = 0

LSB_TYPE = 0

FIR_WIDTH = 23

OUT_WIDTH = FIR_WIDTH - MSB_RM - LSB_RM

DATA_WIDTH = 13

data_type= 1

% check size of inputs.

[DX,DY] = size(stimulation)

[CX,CY] = size(coef_matrix)

if (CX ~= DY * INTER_FACTOR)

fprintf('WARNING : coef_matrix size and input data size is not match\n')

end

%fill coef_matrix to length of data with the latest coef set

if (CX <DY * INTER_FACTOR)

for i= CX +1:DY * INTER_FACTOR

coef_matrix(i,:) = coef_matrix(CX,:)

end

end

%check if input is integer

int_sti=round(stimulation)

T = (int_sti ~= stimulation)

if (max(T)~=0)

fprintf('WARNING : Integer Input Expected: Rounding Fractional Input to Nearest Integer...\n')

end

%Input overflow check

switch data_type

case 1

%set max/min for signed

maxdat = 2^(DATA_WIDTH-1)-1

mindat = -maxdat-1

case 2

%set max/min for unsigned

maxdat = 2^DATA_WIDTH-1

mindat = 0

end

if(data_type == 2)

if(abs(coef_matrix) == coef_matrix)

FIR_WIDTH = FIR_WIDTH +1

end

end

%Saturating Input Value

a=find(int_sti>maxdat)

b=find(int_sti<mindat)

if (~isempty(a)|~isempty(b))

fprintf('WARNING : Input Amplitude Exceeds MAXIMUM/MINIMUM allowable values - saturating input values...\n')

lena = length (a)

lenb = length (b)

for i =1:lena

fprintf('%d >%d \n', int_sti(a(i)), maxdat)

int_sti(a(i)) = maxdat

end

for i =1:lenb

fprintf('%d <%d \n', int_sti(b(i)), mindat)

int_sti(b(i)) = mindat

end

end

% Add interpolation

inter_sti = zeros(1, INTER_FACTOR * length(int_sti))

inter_sti(1:INTER_FACTOR:INTER_FACTOR * length(int_sti)) = int_sti

for i = 1 : DY *INTER_FACTOR

coef_current = coef_matrix(i,:)

output_temp(i) = simp_adaptive (inter_sti, coef_current, i)

end

% Truncate output

len1 = length(output_temp)

switch LSB_TYPE

case 0

%truncate

out_dec = bi_trunc_lsb(output_temp,LSB_RM,FIR_WIDTH)

case 1

%round

out_dec = bi_round(output_temp,LSB_RM, FIR_WIDTH)

end

switch MSB_TYPE

case 0

%truncate

out_dec = bi_trunc_msb(out_dec,MSB_RM,FIR_WIDTH-LSB_RM)

case 1

%round

out_dec = bi_satu(out_dec,MSB_RM, FIR_WIDTH-LSB_RM)

end

% choose decimation output in phase=DECI_FACTOR-1

if(DECI_FACTOR == 1)

output = out_dec

else

output = out_dec(DECI_FACTOR:DECI_FACTOR:len1)

end

function[output, outindex] = simp_adaptive (int_sti, coef_current, data_index, output)

%Simulation is the whole input sequence

%coef_current is the current coefficient set

%data_index gives the last data to use

%outputs are the sum of input and coef multiplication

%outindex is the next data_index

sti_current = zeros(length(coef_current),1)

data_length = length(int_sti)

%Check data index

if (data_index >data_length)

fprintf('ERROR: DATA INDEX IS LARGER THAN DATA LENGTH!!!\n')

return

end

for i = 1: length(coef_current)

if ((data_index -i+1)>0 &(data_index - i+1)<=data_length)

sti_current(i,1) = int_sti(data_index - i+1)

end

end

outindex= data_index+1

output = coef_current * sti_current

% end of function simp_adaptive

function output = bi_round(data_in,LSB_RM,ORI_WIDTH, output)

% LSB_RM is the bit to lose in LSB

% ORI_WIDTH is the original data width

data = round (data_in / 2^LSB_RM)

output = bi_satu(data,0,ORI_WIDTH - LSB_RM)

%end of function bi_trunc_lsb

function output = bi_trunc_lsb(data_in,LSB_RM,ORI_WIDTH, output)

% LSB_RM is the bit to lose in LSB

% ORI_WIDTH is the original data width

%2's complement system

output = bitshift(2^ORI_WIDTH*(data_in<0) + data_in, -LSB_RM) - 2^(ORI_WIDTH-LSB_RM) *(data_in<0)

% end of function bi_round

function output = bi_trunc_msb(data_in,MSB_RM,ORI_WIDTH, output)

% MSB_RM is the bit to lose in LSB

% ORI_WIDTH is the original data width

%2's complement system

data = 2^ORI_WIDTH * (data_in <0)+ data_in

erase_num = 2^(ORI_WIDTH - MSB_RM) - 1

data = bitand(data, erase_num)

output = data - 2^(ORI_WIDTH - MSB_RM)*(bitget(data,ORI_WIDTH - MSB_RM))

%end of bi_trunc_msb

function output = bi_satu(data_in,MSB_RM,ORI_WIDTH, output)

% MSB_RM is the bit to lose in LSB

% ORI_WIDTH is the original data width

%2's complement system

maxdat = 2^(ORI_WIDTH - MSB_RM -1)-1

mindat = 2^(ORI_WIDTH - MSB_RM -1)*(-1)

data_in(find(data_in >maxdat)) = maxdat

data_in(find(data_in <mindat)) = mindat

output = data_in

%end of bi_satu

这段代码是级联积分梳状滤波器中梳状滤波器的部分。

[h1,f1]=freqz(ones(1,D),1,1000,fs)在matlab help中查freqz有详细解释及举例。该句用于分析长度为5的FIR滤波器的频率响应,返回值h1为频率响应,f1为频率轴,已经是以Hz为单位了(0~fs/2)

因此下句也就用错了

plot(f1/(fs/2),20*log10(abs(h1))-max(20*log10(abs(h1)))应改为

plot(f1,20*log10(abs(h1))-max(20*log10(abs(h1)))

此时画出的是幅频图,幅度进行了归一化,幅度单位是dB。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11108224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存