oddhkz_cos.m
来自「基于余弦调制多相滤波器的设计」· M 代码 · 共 92 行
M
92 行
function Hk_z = oddHkz(Theta,M_ch,m)
% M_ch:
% m:
% Theta:
Num_lattice = floor(M_ch/2); % 无损网格个数
Theta = Theta(1:m*Num_lattice);
Theta = reshape(Theta,Num_lattice,[]);
[iRow,iCol] = size(Theta);
if((iRow ~= Num_lattice) || (iCol ~= m))
disp('Error Theta');
return;
end
syms w z;
Theta = sym(Theta);
pi = 4*atan(1);
P_puredelay = [pi/4 pi/2*ones(1,m-1)]; % 纯延时单元的参数即为初始化的参数
P_puredelay = sym(P_puredelay);
% 第1步:由Theta得到G_k(z)和G_Mk(z)
G_kpz = [cos(Theta(:,1)) zeros(Num_lattice,m-1)];
G_Mkpz = [sin(Theta(:,1)) zeros(Num_lattice,m-1)];
G_oddk = [cos(P_puredelay(1)) zeros(1,m-1)];
G_oddMk = [sin(P_puredelay(1)) zeros(1,m-1)];
j = sqrt(-1);
z = -exp(2*M_ch*j*w);
for k=1:Num_lattice
for p=1:(m-1)
G_kpz(k,p+1) = G_kpz(k,p)*cos(Theta(k,p+1)) + z^(-1)*G_Mkpz(k,p)*sin(Theta(k,p+1));
G_Mkpz(k,p+1) = G_kpz(k,p)*sin(Theta(k,p+1)) - z^(-1)*G_Mkpz(k,p)*cos(Theta(k,p+1));
end
end
% 以上共有Num_lattice个网格,当M_ch为奇数时,还需要添加一个单独的网格,用来表示剩余的两个纯延时单元
for p=1:(m-1)
G_oddk(p+1) = G_oddk(p)*cos(P_puredelay(p+1)) + z^(-1)*G_oddMk(p)*sin(P_puredelay(p+1));
G_oddMk(p+1) = G_oddk(p)*sin(P_puredelay(p+1)) - z^(-1)*G_oddMk(p)*cos(P_puredelay(p+1));
end
% 第2步:根据对称性得出所有的2M个G(z)值
% G_k(z) = z^(-(m-1))G_2Mk(z)' 0 =< k =< M-1 --- algorithm
% G_z = [G_kpz(:,m);zeros(Num_lattice+1,1);G_Mkpz(:,m);zeros(Num_lattice+1,1)];
% for k=1:2*M_ch
% if((k > Num_lattice+1 && k <= M_ch+1) || (k > M_ch+1 && k <= 2*M_ch))
% G_z(k) = z^(-(m-1))*G_z(2*M_ch-k+1)';
% else
% G_z(k) = G_z(k);
% end
% end
% modified 20071015 ------------------ %
G_z = [G_kpz(:,m);zeros(Num_lattice+1,1);G_Mkpz(:,m);zeros(Num_lattice+1,1)];
for k=1:2*M_ch
if((k > Num_lattice+1 && k <= M_ch) || (k > M_ch+Num_lattice+1 && k <= 2*M_ch))
G_z(k) = z^(-(m-1))*G_z(2*M_ch-k+1)';
else
G_z(k) = G_z(k);
end
end
% 最终的G(z)值(包括两个纯延时单元)
% G_z(Num_lattice+1) = G_oddk(m);
% G_z(3*Num_lattice+2) = G_oddMk(m);
% --- modified 20071015 ------------- %
G_z((M_ch-1)/2+1) = G_oddk(m);
G_z(M_ch+(M_ch-1)/2+1) = G_oddMk(m);
% 第3步:由2M个G(z)值得到H(z), 已经表示成H(e^jw)的形式
w0 = (0:0.01:2*pi);
Hz_MF = zeros(size(w0));
Hk_z = sym(zeros(M_ch,1));
for P_ch=1:M_ch
for q=1:2*M_ch
syms w;
Hk_z(P_ch) = Hk_z(P_ch) + 2*cos((2*(P_ch-1)+1)*pi*((q-1)-(2*m*M_ch-1)/2)/(2*M_ch)+(-1)^(P_ch-1)*pi/4) * exp(-(q-1)*j*w)*G_z(q)*(1/sqrt(4*M_ch));
end
% plot the magnitude-frequency response
for L=1:length(w0)
w = w0(L);
Hz_MF(L) = abs(eval(Hk_z(P_ch)));
end
Hz_MF = Hz_MF/max(Hz_MF);
Hz_MF = 20*log10(Hz_MF);
plot(w0(1:floor(length(w0)/2))/2/pi,Hz_MF(1:floor(length(w0)/2)));hold on;
end
% Hk_z = vpa(Hk_z);
hold off;axis([0,0.5,-80,5]);title('Analysis section');
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?