clc; clear; close all; warning off; addpath(genpath(pwd)); format long; M=8; %% chnnale numbers m=4; %% factor N=2*m*M; F=10; limit=1e-8; alpha=1e4; iota=0.6; [pFilter]=cmfb_pfd_lim(M,m,F,limit,alpha,iota); bVector=pFilter; aVector=[1]; [h,w]=freqz(bVector,aVector,1024); figure(1);subplot(2,2,1);plot(w/(2*pi),20*log10(abs(h)/max(abs(h))),'r');hold on xlabel('归一化频率');ylabel('幅频响应 (dB)');axis([0,0.5,-150,10]); title('Prototype Filter'); for ikk=1:M for inn=1:N CMFB_Analysis_Matrix(ikk,inn)=2*pFilter(inn)*cos((2*(ikk-1)+1)*pi/(2*M)*(inn-1-(N-1)/2)+(-1)^(ikk-1)*pi/4); CMFB_Synthesis_Matrix(ikk,inn)=2*pFilter(inn)*cos((2*(ikk-1)+1)*pi/(2*M)*(inn-1-(N-1)/2)-(-1)^(ikk-1)*pi/4); end; bVector=CMFB_Analysis_Matrix(ikk,:); [h,w]=freqz(bVector,aVector,1024); figure(1);subplot(2,2,3);plot(w/(2*pi),20*log10(abs(h)/max(abs(h))));hold on xlabel('归一化频率');ylabel('幅频响应 (dB)'); title('Analysis Filter Banks');axis([0,0.5,-150,10]); bVector=CMFB_Synthesis_Matrix(ikk,:); [h,w]=freqz(bVector,aVector,1024); figure(1);subplot(2,2,4);plot(w/(2*pi),20*log10(abs(h)/max(abs(h))));hold on xlabel('归一化频率');ylabel('幅频响应 (dB)'); title('Synthesis Filter Banks');axis([0,0.5,-150,10]); end; %% 应用滤波器组 % E=reshape(h,M,lh/M); %analysis filters % for ikk=1:M % bVector=CMFB_Analysis_Matrix(ikk,:); % [H,w]=freqz(bVector,1,1024); % figure(); % % subplot(1,2,ikk) % % stem(bVector) % plot(w/(2*pi),20*log10(abs(H)/max(abs(H)))); % % hold on % xlabel('归一化频率');ylabel('幅频响应 (dB)'); % % title('Analysis Filter Banks');axis([0,0.5,-150,10]); % end T = 1; %Sampling time fs = 10e5; fc = fs/2; t = T/fs:(T/fs):T; x=2*cos(2*pi*(fc/M*3)*t)+cos(2*pi*(fc/M*6.2)*t); lx=length(x);这是一个余弦调制滤波器组,现在我输入了一个输入信号x,如何实现它的滤波过程
时间: 2024-03-21 16:37:41 浏览: 137
在余弦调制滤波器组中,分析滤波器和合成滤波器的系数矩阵已经计算出来了,现在可以使用这些滤波器对输入信号进行滤波。
首先,将输入信号分成每个通道的子信号。对于当前的余弦调制滤波器组,共有 M 个通道,因此将输入信号分成 M 个子信号。
然后,对于每个通道,使用相应的分析滤波器进行滤波操作,得到每个通道的低通信号。
接下来,将每个通道的低通信号上采样 M 倍,并使用相应的合成滤波器进行滤波操作,得到每个通道的重建信号。
最后,将每个通道的重建信号相加,得到最终的输出信号。
下面是实现代码:
```
% 分离每个通道的子信号
x_channel = reshape(x, [], M);
% 对每个通道进行滤波操作
y_lowpass = zeros(size(x_channel));
for ikk = 1:M
bVector = CMFB_Analysis_Matrix(ikk,:);
y_lowpass(:,ikk) = filter(bVector, 1, x_channel(:,ikk));
end
% 对每个通道的低通信号进行上采样和滤波操作,得到重建信号
y_upsample = zeros(size(y_lowpass, 1) * M, M);
for ikk = 1:M
y_upsample(:,ikk) = upsample(y_lowpass(:,ikk), M);
bVector = CMFB_Synthesis_Matrix(ikk,:);
y_upsample(:,ikk) = filter(bVector, 1, y_upsample(:,ikk));
end
% 将每个通道的重建信号相加,得到最终的输出信号
y = sum(y_upsample, 2);
```
注意,上述代码中的 upsample 函数需要自己实现,可以使用插值法实现上采样操作。另外,输出信号 y 的长度应该是输入信号 x 长度的 M 倍。
阅读全文