matlab 自己写的DFT滤波器组(复数调制滤波器组),将信号展开成二维时频域分布图

根据胡广书《现代数字信号处理》中复数调制滤波器组理论。

先设计一个低通原型滤波器H(z),单位抽样响应为h(n),频带范围为-\pi /M\sim \pi /M

通过调制h(n)得到M个分析滤波器。调制因子{\color{Red} }{\color{Red} }exp(j\frac{2\pi }{M}kn) ,相应频谱是H(e^{^{j\omega }})做均匀位移所得。 

这里滤波器组个数M=256,滤波器阶数256。测试信号为线性调频信号。

%% DFT分析滤波器组(chirp测试文件)
%用fir1函数设计FIR滤波器
%再调制单位脉冲响应
clc
close all
clear all
%% 设计原型滤波器
M=256;        %滤波器个数
N=257;       %滤波器长度
fs=5000;    %采样频率
fc_lpf=200;
%以采样滤波的一半,对频率进行归一化处理
% wn_lpf=fc_lpf*2/fs;
wn_lpf=1/(2*M);
%采用fir1函数设计FIR滤波器
b1=fir1(N-1,wn_lpf);
%幅频响应
m1=20*log10(abs(fft(b1)));
%设置幅频响应的横坐标单位为Hz
x_f=(0:(fs/length(m1)):fs/2);

% figure(1)
% plot(abs(b1));
% figure(2)
% plot(x_f,m1(1:length(x_f)));
% plot(abs(fft(b1)));
%% 测试信号
t=0:1/fs:1;
sig=chirp(t,0,1,5000);

%% 调制单位脉冲响应
n=1:N;
b_out=zeros(M,N);%每个滤波器的单位抽样响应
y_out=zeros(M,length(sig));%通过滤波器组后的信号矩阵

for i=1:M
    k=i-1;
    b_channel=b1.*exp(1i*2*pi*n*(k/M));    %对原型滤波器H(z)的单位抽样响应h(n)复数调制
    y_channel_out=filter(b_channel,1,sig);  
    b_out(i,:)=b_channel;                   %每个通道的单位抽样响应
    y_out(i,:)=y_channel_out;               %输出时频信号矩阵


%     plot(20*log10(abs(fft(b_channel))));
%     axis([0 M -30 0]);
%     hold on

end
figure,imagesc(abs(y_out));

频率范围0-2*pi的chirp信号通过分析滤波器组后的结果如下图:

可以看到有通过滤波器组有延时,延时为(N-1)/2 .

把延时去掉

delay=(N-1)/2;         %群延时
y_out_delay=y_out(:,delay:length(y_out));
l=ceil(length(t)/2);
figure,imagesc(abs(y_out_delay(1:(M/2),1:l)));

结果如下图:

 横坐标为时间间隔,纵坐标为频率。

存在一些问题:是否是因为傅里叶变换而使得信号在频域对称。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于DFT滤波器的OFDM代码的示例,使用了Python语言和NumPy库: ```python import numpy as np # OFDM参数 N = 64 # 子载波数量 cp = 16 # 循环前缀长度 P = 8 # 每个OFDM符号中的导频数量 pilotValue = 3+3j # 导频值 allCarriers = np.arange(N) # 所有子载波的频率编号 pilotCarriers = allCarriers[::N//P] # 导频所在的子载波的频率编号 dataCarriers = np.delete(allCarriers, pilotCarriers) # 非导频的子载波的频率编号 # 生随机数据 bits = np.random.binomial(n=1, p=0.5, size=(len(dataCarriers), )) # 将数据调制为QPSK符号 QPSK = { 0: -1-1j, 1: -1+1j, 2: 1-1j, 3: 1+1j } data = np.array([QPSK[b0*2+b1] for b0, b1 in zip(bits[::2], bits[1::2])]) # 将数据插入所有子载波 x = np.zeros(N, dtype=complex) x[dataCarriers] = data # 生导频序列 pilot = np.zeros(N, dtype=complex) pilot[pilotCarriers] = pilotValue # OFDM符号 xt = np.fft.ifft(x) xt = np.hstack([xt[-cp:], xt]) # 添加循环前缀 xt = np.hstack([pilot, xt]) # 添加导频 # DFT滤波器 H = np.fft.fft(np.eye(N)) # 将OFDM符号与滤波器卷积 Xf = np.dot(H, xt) # 串行传输 txSig = Xf.reshape((-1,)) ``` 在这个示例中,我们同样假设OFDM系统使用64个子载波,其中8个子载波用作导频,其余子载波用于传输数据。在将随机数据调制为QPSK符号后,我们将数据插入所有子载波。之后,我们生导频序列,并将其插入到OFDM符号中。在计算IFFT之后,我们添加循环前缀和导频。接下来,我们使用NumPy库中的fft函数计算DFT滤波器,并将OFDM符号与滤波器卷积。最后,我们通过将OFDM符号重新排列为一维数来进行串行传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值