【Matlab】rayleighchan函数的使⽤⽅法
rayleighchan实现瑞利多径衰落信道
1.命令格式:
chan = rayleighchan(ts,fd,tau,pdb)
其中:
ts—为输⼊信号的采样周期,
fd—就是Doppler频偏,以Hz为单位,与速率的换算关系为v×fc/c,fc是载频
tau—输⼊的信道参数,⼀个向量,包含了各径的延时,以s为单位
pdb—输⼊的信道参数,⼀个向量,包含了各径的功率(当然是均值啦,实际产⽣的能量都是以此为均值的随机量),以dB为单位。
然后y = filter(chan,x),即可将信道的影响加在输⼊的数据x上。
2.原理:
rayleighchan函数⽣成信道的过程实际是设计⼀个多抽头的滤波器,⽽滤波器的系数计算是多个sinc函数加权、延时后的求和:
g(n)=\sum_k{ sinc( tau(k)/Ts-n) h(k) },-N1<=n<=N2
其中N1和N2的选取要使得在-N1<=n<=N2之外的g(n)很⼩可忽略。
rayleighchan函数的实现步骤是这样的:
1) h(k)看作是⼀串冲激函数,与sinc函数卷积,sinc函数的边瓣周期由输⼊参数采样时间Ts决定,如果看连续时间波形的话,整个信道响应就是多个不同时延、不同幅度的sinc函数的叠加;
2) 对这个连续的信道响应进⾏采样得到信道滤波器的抽头系数,采样间隔为Ts,⽽采样点的个数是要保证舍弃位置的信道响应⾜够⼩可以忽略,如果采样率过⼩则Ts较⼤sinc函数衰减慢,需要保存较多个抽头系数,此时很可能在第⼀径位置之前出现若⼲个信道采样点,即
h(n)~=0, n<0;
3)输⼊信号(以Ts为间隔的采样点)与滤波器进⾏卷积输出(filter函数的作⽤)。
注:输⼊信号和多径衰落信道的采样间隔必须相同。
3.补充:
sinc函数定义:sinc(x)=sin(x)/x
4.举例:
程序:
clear all
close all
clc
%-----------------------------升余弦滤波器
Fs=9600;            %采样频率
Ts=1/Fs;            %采样间隔
Fd=960;              %Doppler频偏,以Hz为单位
tau=[0,0.002];          %多径延时,以s为单位
pdf=[0,0];          %各径功率,以dB位单位
h=rayleighchan(Ts,Fd,tau,pdf);
%-------------------------------通过信道
data1=[1,zeros(1,100)];%数据1
fc=96;
t=0:1/Fs:999*(1/Fs);
data2=cos(2*pi*fc*t); %数据2
data2_fft=fft(data2,100);
data2_abs=abs(data2_fft);
y1=filter(h,data1);
y11=abs(y1);
y2=filter(h,data2);
y22=fft(y2,100);
y222=abs(y22);
subplot(2,2,1);
x1=1:length(data1);
h1=stem(x1,data1);
set(h1,'MarkerFaceColor','red')
subplot(2,2,3);
x3=1:length(y11);
h3=stem(x3,y11);
set(h3,'MarkerFaceColor','red')
subplot(2,2,2);
x2=1:length(data2_abs);
h2=stem(x2,data2_abs);
set(h2,'MarkerFaceColor','blue')
subplot(2,2,4);
x4=1:length(y222);
h4=stem(x4,y222);
set(h4,'MarkerFaceColor','blue')
分析:
1.tau延时向量,时域上的参数,时域采样后延迟的点数为fix(tau/Ts).
2.Fd:多普勒频偏,频域上的参数,可以看到信号频域发⽣偏移,但是并不是简单的频率搬移,⽽是信号频率发⽣扩展,原来是单频信号,变为频率段信号。
经过数值的设定可以看到,在command history框下输⼊chan得到:
chan的writeable properties
1) 如何设定chan所需的各径的多普勒谱?
多普勒谱的种类⼀共有7种:
doppler.ajakes;doppler.bigaussian;doppler.jakes;doppler.rjakes;doppler.flat;doppler.gaussian和unded。
在rayleighchan函数中默认的是Jakes谱,即doppler.jakes。修改多普勒谱的⽅法是直接对chan.DopplerSpectrum进⾏设置。
这⾥默认了各径都是按照gaussian谱来⽣成的,如果需要各径的Doppler谱不同则可以通过设置 ,即可得到对应于PathDelays的各径DopplerSpectrum。
2) InputSamplePeriod
直接设置即可,⽆线信道传输的基带信号的符号周期。
3) PathDelays
每条径的延时,单位是seconds。
4) MaxDopplerShift
最⼤多普勒频移:对于rayleighchan函数的使⽤⽅法研究
5) AvgPathGaindB
每条路径增益的平均功率,单位是分贝。
6) StoreHistory
将chan.StoreHistory设置为1时,可以把信道的信息记录下来,并可以通过Plot(chan)画出当前的信道的时域IR,频域相应等各种图。
7) NormalizePathGains
将chan.NormalizePathGains设置为1时,每条路径增益绝对值的平⽅和(即功率和)的平均值为1。这个可以通过多次使⽤rayleighchan ⽣成信道,求取信道各路径增益绝对值的平⽅和即可看到其平均值为1。
8) StorePathGains
将chan.StorePathGains设置为1时,各路径的增益将会被记录下来,但是不能使⽤Plot(chan)画图。
在这⾥额外说⼀点,信道的StorePathGains设为1时,查看chan.PathGains可以发现这个值是⼀个N×M的矩阵,在这⾥N是信道处理的数据长(也就是输⼊信号的长度),M是多径数。这⾥的chan.PathGains每列是线性变化的,原因是在处理每个数据时信道由于受到多普勒谱的影响是时变的,但信道的状态是连续的。
9) ResetBeforeFiltering
用subplot函数
将chan.ResetBeforeFiltering在使⽤filter函数前设置为0时,可以看到信道各路径的斜率会是⼀个值,也就是⽆论处理多少数据信道的实际状态都是连续的,⽆论其他的条件(⽐如噪声和输⼊信号)发⽣怎样的变化,信道的状态是连续的,但不是说信道的增益值是恒定的数值,只是信道增益的实际值线性增长的,信道的状态时连续的。(每次使⽤filter函数⼀次,信道增益的实际数值都是会发⽣变化的。
)只要信道的状态不变就相当于信道没有发⽣质的变化,在仿真时我们可以认为使⽤的是同⼀个信道。
如果设置为1,则是说明每次⽣成的信道增益的状态是不连续的,也就是信道发⽣了变化,我认为这在仿真时可以控制信道变化的快慢。chan2的read-only properties
1) ChannelType
这个就没什么好说了,只是说明使⽤函数⽣成的信道是瑞利的还是莱斯的。
2) PathGains
信道各路径的真实增益,这个增益不是通过AvgPathGaindB换算过来的,AvgPathGaindB是平均增益,所以⽣成的各路径增益的功率值是围绕这个值⽣成的。
3) ChannelFilterDelay
这个值没有什么好说的,原因是这个值没有什么⽤,它⼀般是和信道的PathDelays的第⼀个值是对应的。
4) NumSamplesProcessed
这个值是说信道处理了多少个数据,如果输⼊信号⽮量的长度是N,则这个值就是N。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。