z = conv(x,H); %注,后面截取 FFT_z = abs(fft(z,N_FFT)); abs_FFT_z = fftshift(FFT_z); f = (-N_FFT / 2 : N_FFT / 2 - 1) * Fs / N_FFT; figure(3); plot(f,abs_FFT_z); figure(4); subplot(2,1,1); plot(t,x); title('输入信号'); subplot(2,1,2); plot([0:199] * dt,z); hold on; plot([1 1] * (N - 1) / 2 * dt, ylim,'r'); plot([3,3], ylim,'r'); xlabel('时间/s'); title('输出z卷积数据');
时间: 2024-03-15 19:41:35 浏览: 126
这是一段MATLAB代码,它实现了一个信号x和一个滤波器H的卷积运算,并绘制了输出信号z的FFT频谱和时域波形。其中,x和H均为向量,z为卷积后的输出向量,N_FFT是FFT变换点数,Fs是采样率,t是时间向量,dt是采样时间间隔,N是卷积后输出信号的长度。figure(3)和figure(4)是两个图形窗口,subplot(2,1,1)和subplot(2,1,2)分别在第一个和第二个窗口中绘制两个子图,分别表示输入信号和输出信号。在输出信号的图中,红色竖线表示滤波器的中心位置,即卷积的起始位置,而第二个红色竖线则表示输入信号的结束位置。
相关问题
%OFDM_basic.m clear all NgType=1; %对于CP或ZP,NgType=1或2 if NgType==1 nt='CP'; elseif NgType==2 nt='ZP'; end Ch=0; if Ch==0 chType='AWGN'; Target_neb=100; else chType='CH'; Target_neb=500; end figure(Ch+1),clf PowerdB=[0 -8 -17 -21 -25];%信道抽头功率特性'dB' Delay=[0 3 5 6 8];%信道时延(采样点) Power=10.^(PowerdB/10);%信道抽头功率特性(信道尺度) Ntap=length(PowerdB);%信道抽头数 Lch=Delay(end)+1;%信道长度 Nbps=4;M=2^Nbps;%调制阶数=2/4/6:QPSK/16-QAM/64-QAM Nfft=64; %FFT大小 Ng=Nfft/4;%GI的长度,没保护间隔时,Ng=0 Nsym=Nfft+Ng;%符号周期 Nvc=Nfft/4;%Nvc=0:没有VC Nused=Nfft-Nvc; EbN0=0:5:20;%Eb/N0 N_iter=le5;%对于每一EbN0的迭代次数 Nframe=3;%每一帧的符号数 sigPow=0;%初始信号功率 file_name = ['OFDM_BER_' chType '_' num2str(nt) '_GL' num2str(Ng) '.dat']; fid=fopen(file_name,'w+'); norms=[1 sqrt(2) 0 sqrt(10) 0 sqrt(42)];%BPSK 4-QAM 16-QAM for i=0:length(EbN0) rng('state',0);rng('state',0); Ber2=ber();%初始化BER Neb=0;%初始化错误比特数 Ntb=0;%初始化总比特数 for m=1:N_iter %Tx___________________________________________ X=randi(1,Nused*Nframe,M);%bit:整数向量 Xmod=qammod(X,M,'gray')/norms(Nbps); if NgType~=2 x_GI=zeros(1,Nframe*Nsym); elseif NgType==2 x_GI=zeros(1,Nframe*Nsym+Ng); %用Ng个零扩展OFDM符号 end kk1=1:Nused/2; kk2=Nused/2+1:Nused; kk3=1:Nfft; kk4=1:Nsym; for k=1:Nframe if Nvc~=0 X_shift=[0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)]; else X_shift=[Xmod(kk2) Xmod(kk1)]; end x=ifft(X_shift); x_GI(kk4)=guard_interval(Ng,Nfft,NgType,x); kk1=kk1+Nused; kk2=kk2+Nused; kk3=kk3+Nfft; kk4=kk4+Nsym; end if Ch==0 y=x_GI;%没有信道 else %多径衰落信道 channel=(randn(1,Ntap)+1i*randn(1,Ntap)).*sqrt(Power/2); h=zeros(1,Lch);%信道脉冲响应 h(Delay+1)=channel; y=conv(x_GI,h); end if i==0 %只测信号功率 y1=y(1:Nframe*Nsym); sigPow=sigPow+y1*y1; continue; end %加AWGN噪声_________________________________________________ snr=EbN0(i)+10*log10(Nbps*(Nused/Nfft));% SNR vs.Eb/N0 noise_mag=sqrt((10.^(-snr/10))*sigPow/2); y_GI=y+noise_mag*(randn(size(y))+1i*randn(size(y))); %Rx_________________________________________________________ kk1=(NgType==2)*Ng+(1:Nsym); kk2=1:Nfft; kk3=1:Nused; kk4=Nused/2+Nvc+1:Nfft; kk5=(Nvc~=0)+(1:Nused/2); if
### OFDM 基本 MATLAB 仿真代码调试与优化
在处理正交频分复用 (Orthogonal Frequency Division Multiplexing, OFDM) 的基本 MATLAB 仿真时,循环前缀 (Cyclic Prefix, CP) 和零填充 (Zero Padding, ZP),以及加性高斯白噪声 (Additive White Gaussian Noise, AWGN) 或信道配置 (Channel Configuration, CH) 是常见的关注点。以下是针对这些方面的调试和优化建议:
#### 循环前缀 (CP) 和零填充 (ZP)
对于 CP 和 ZP,在实现过程中需要注意以下几点:
- **CP 实现**:通常通过复制数据帧的最后一部分并将其附加到帧的开头来完成。这有助于消除多径效应中的符号间干扰 (Inter-Symbol Interference, ISI)[^1]。
```matlab
% 添加循环前缀
cpLength = floor(length(ofdmSymbols)/8); % 设置 CP 长度
txSignalWithCP = [ofdmSymbols(end-cpLength+1:end); ofdmSymbols];
```
- **ZP 实现**:相比 CP,ZP 更简单,只需向信号中插入一定数量的零即可。这种方法可以减少计算复杂度,但在某些情况下可能不如 CP 效果好。
```matlab
% 添加零填充
zpLength = cpLength; % 设定相同的长度作为对比
txSignalWithZP = [zeros(zpLength,1); ofdmSymbols];
```
#### 加性高斯白噪声 (AWGN) 处理
当引入 AWGN 时,需注意 SNR 参数设置及其对误码率的影响。MATLAB 提供了内置函数 `awgn` 来简化这一过程[^2]。
```matlab
snrDb = 20; % 定义信噪比
rxSignalNoisy = awgn(txSignalWithCP, snrDb, 'measured');
```
#### 信道模型 (CH Configurations)
实际应用中,考虑不同类型的信道传播特性至关重要。例如瑞利衰落或多普勒效应对通信质量的影响可以通过构建相应的随机矩阵模拟出来。
```matlab
channelTaps = randn(1,3)+1i*randn(1,3); % 创建三抽头 Rayleigh 衰落信道
rxSignalFaded = conv(rxSignalNoisy, channelTaps,'same'); % 卷积操作表示经过该信道后的接收信号
```
以上方法能够有效提升 OFDM 系统性能,并为后续分析提供可靠的数据基础。
%% 多径信道 fd = 0;%最大多普勒频移 f_shift = rand(1,num_path)*2*fd - fd; %Doppler shifts channel = (sqrt(Power./2)).*(randn(1,num_path)+1i*randn(1,num_path)); h(delay+1) = channel.*exp(1j*2*pi*f_shift); H_channel = fft(h,Nfft); Y_mul = conv(tsig,h); Y_mul = Y_mul(1:Ns*Nofdm);是什么意思
这段代码实现了一个多径信道,其中num_path表示多径的数量,fd表示最大的多普勒频移。程序中生成了一个长度为num_path的随机序列f_shift,表示不同多径成分的Doppler频移。Power是多径成分的功率,channel是多径成分的复数增益系数。程序中的h(delay+1)表示将多径响应放置到相应的时刻位置上,并加上Doppler频移。其中delay表示多径响应的延迟,h是多径响应的时域响应。H_channel是多径信道的频域响应。接下来,程序中的Y_mul表示将传输信号tsig通过多径信道进行卷积,得到接收信号Y_mul。最后,程序中的Y_mul(1:Ns*Nofdm)用于去掉卷积后信号中的冗余部分。
阅读全文
相关推荐

















