?? matlab仿真ddc程序.txt
字號(hào):
我設(shè)計(jì)一個(gè)DDC使用的級(jí)聯(lián)濾波器,結(jié)構(gòu)CIC6+CFIR+PFIR,輸入一個(gè)噪聲信號(hào),可是出來的頻譜不對(duì),
希望抑制是70dB,哪位DX指出問題所在,謝謝!
附程序:
function ddc_main_c;
clc
clear
%輸入信號(hào)
N=38400*18;
ys=randn(1,N)+j*randn(1,N);
% CIC
cic_m = 1;
cic_ratio = 4; % Interpolation factor
cic_stage = 6;
% RRC FIR 成型濾波器
forcePFIRnum = 64;
pfir_alpha = .22;
pfir_oversample_factor = 2;
pfir_ratio = 1;
pfir_Passbd = .1;
pfir_Stopbd = -90;
pfir_Fp = 2.05e6;
pfir_Fs = 2.5e6;
pfir_windowtype = 4;
PFIRcoef_bits = 18;
% CFIR
numCFIRtaps = 32;
cfir_Passbd = .1;
cfir_Stopbd = -90;
cfir_Fp = 2.1e6;
cfir_Fs = 4.9e6;
cfir_ratio = 2;
CFIRcoef_bits = 18;
clock_rate = 61.44e6;
CFIRClk = 15.36e6;
PFIRClk = 7.68e6;
symbol_rate = 3.84e6;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 計(jì)算CIC 系數(shù)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
numConv = cic_stage - 1;
%boxtaps1 = ones(((cic_ratio-1) * cic_m), 1);
boxtaps = [1,1,1,zeros(1,10)]';
a = boxtaps;
for n = 1 : numConv
a = conv(a, boxtaps);
end
CICtaps = a;
CICtaps = CICtaps/sum(CICtaps);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% cfir coefficients
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CFIRtaps=[-4.3378e-005,-0.00030659,-0.00073532,-0.0002154,0.0022624,0.0035708,-0.0022471,-0.011223,-0.005056,0.020402,0.027417,-0.020653,-0.074136,-0.014301,0.18948,0.3856,0.3856,0.18948,-0.014301,-0.074136,-0.020653,0.027417,0.020402,-0.005056,-0.011223,-0.0022471,0.0035708,0.0022624,-0.0002154,-0.00073532,-0.00030659,-4.3378e-005];
CFIRtaps = CFIRtaps/sum(CFIRtaps);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%CFIR coefficients
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
flen = length(CFIRtaps);
X(1: flen) = 1: 1: flen;
figure(1);
plot(X, CFIRtaps,'.b');
titletext = sprintf('CFIR filter, %d taps', flen);
title( titletext);
zoom on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PFIR coefficients
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PFIRtaps = [1.3755e-005,-3.6532e-005,-3.6687e-007,-3.4754e-005,1.4136e-005,0.00013723,-7.0815e-005,-0.0002004,0.00012791,0.00014732,-7.2394e-005,3.0015e-005,-0.00021621,-0.00021917,0.00072527,0.00023771,-0.0011567,-2.8379e-005,0.00087779,-4.1044e-005,0.0009272,-0.0011116,-0.0049059,0.0054664,0.011119,-0.016119,-0.018777,0.038547,0.026313,-0.089119,-0.031845,0.31239,0.53375,0.31192,-0.031748,-0.088715,0.026154,0.038255,-0.018606,-0.015947,0.010984,0.0053909,-0.0048303,-0.0010927,0.00090985,-4.0206e-005,0.00085834,-2.77e-005,-0.0011269,0.00023114,0.00070382,-0.00021224,-0.00020894,2.8939e-005,-6.9637e-005,0.00014136,0.00012241,-0.00019127,-6.7392e-005,0.00013019,1.3366e-005,-3.2744e-005,-3.4431e-007,-3.4139e-005];
PFIRtaps = PFIRtaps/sum(PFIRtaps);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% plot PFIR filter results
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
flen = length(PFIRtaps);
X(1: flen) = 1: 1: flen;
figure(2);
plot(X, PFIRtaps,'.b');
titletext = sprintf('PFIR filter, %d taps', flen);
title( titletext);
zoom on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CIC 濾波,抽取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ys = filter(CICtaps,1,ys);
ys = downsample(ys,cic_ratio);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CFIR 濾波,抽取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ys = filter(CFIRtaps,1,ys);
ys = downsample(ys,2);
figure(3);
titletext = sprintf('h(x) = CFIR* CIC');
%dectaps = scalereal( dectaps, FIRmax); % scalereal?
FFT64KNoFig( ys,CFIRClk, titletext); % function FFT64KNoFig( d, FClk, titletext)
zoom on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PFIR 濾波,抽取
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ys = filter(PFIRtaps,1,ys);
ys = downsample(ys,2);
figure(4);
titletext = sprintf('h(x) = PFIR * CFIR* CIC' );
FFT64KNoFig( ys,PFIRClk, titletext);
zoom on;
return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function FFT64KNoFig( d, FClk, titletext) % FFT64KNoFig( dectaps, CFIRClk, titletext);
FFTsize = 65536; % 2^16
lend = length(d); % 系數(shù)長度
b(1: FFTsize) = 0; % zero fill the array
b(1: lend) = d(1: lend); % 賦值
F= fft(b, FFTsize); % FFT h(t)
F= F(1: FFTsize/2); % We only need the first half of the FFT
Xmax = FClk/2; %第1 Nequist區(qū)域
X= linspace(0, Xmax, FFTsize/2); %產(chǎn)生從 0-Xmax的 FFTsize/2 個(gè)點(diǎn),
F= F + (realmin + realmin*i); % This prevents log(0) warnings
FF= 20*log10(abs(F)); % Compute log of magnitude
maxFF = max(FF);
FF = FF - maxFF; % dBc
plot(X, FF);
title( titletext);
axis( [0 Xmax (max(FF)-120) max(FF)]); grid; % Plot the data
return;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -