分享一些我在学习UWB过程中手打下来的一些UWB仿真Matlab代码,具体内容参考葛利嘉老师的译作《超宽带无线电基础》这本书
- % [rect_A,dt_A]=cp0101_genrect(1e-1,1000,0);
- [rect_B,dt_B]=cp0101_genrect(1e-1,1000,1e3);
- % cp0101_bandwidth1(rect_A,dt_A,-3);
- cp0101_bandwidth1(rect_B,dt_B,-10);
- function [ss_E,f_high,f_low,BW]=cp0101_bandwidth1(signal,dt,threshold)
- %计算固定取样周期“dt”的“signal”的带宽,以及计算带宽所需的预知threshold
- %step1计算输入数据单边功率密度谱(ESD)
- fs=1/dt; %采样频率
- N=length(signal); %样本数量
- T=N*dt; %窗口时间
- df=1/T; %基本频率
- X=fft(signal); %快速傅里叶变换,也叫离散傅里叶变换,转换后为离散的双边振幅频谱
- X=X/N; %matlab频谱转换为傅里叶频谱
- ds_E=abs(X).^2/(df^2); %双边ESD//abs(X)对X取绝对值
- ss_E=2.*ds_E(1:floor(N/2)); %单边ESD
- %STEP2我们利用迭代算法计算出相对于特定阈值的ESD的最高和最低频率,
- %从而估算出被检测信号所占用带宽。这种算法同时适用于基带信号和已调制信号
- [Epeak,index]=max(ss_E); %Epeak为单边ESD的峰值,index是该峰值所在位置
- f_peak=index*df; %频率峰值
- Eth=Epeak*10^(threshold/10);
- imax=index;
- E0h=ss_E(index);
- while (E0h>Eth)&(imax<=(N/2))
- imax=imax+1;
- E0h=ss_E(imax);
- end
- f_high=(imax-1)*df;
- imin=index;
- E0l=ss_E(index);
- while (E0h>Eth)&(imin>1)&(index>1)
- imin=imin-1;
- E0l=ss_E(imin);
- end
- f_low=(min(index,imin)-1)*df;
- BW=f_high-f_low;
- fprintf('\nFrequency Bandwidth = %f [HZ]\n High Frequency= %f [HZ]\nLow Frequency= %f [HZ]\n',BW,f_high,f_low);
- %step3 画图
- figure(2)
- frequency=linspace(0,fs/2,length(ss_E));
- PF=plot(frequency,ss_E);
- set(PF,'LineWidth',[2]);
- L1=line([f_high f_high],[min(ss_E) max(ss_E)]);
- set(L1,'Color',[0 0 0],'LineStyle',':');
- L1=line([f_low f_low],[min(ss_E) max(ss_E)]);
- set(L1,'Color',[0 0 0],'LineStyle',':');
- L1=line([f_low f_high],[Eth Eth]);
- set(L1,'LineWidth',[2],'Color','red','LineStyle',':');
- axis([0.8*f_low 1.2*f_high -0.1*Epeak 1.2*Epeak]);
- AX=gca;
- set(AX,'FontSize',12);
- T=title('Frequency domain');
- set(T,'FontSize',14);
- X=xlabel('频率 [Hz]');
- set(X,'FontSize',14);
- Y=ylabel('单边ESD [V^2S/Hz]');
- set(Y,'FontSize',14);
- end
复制代码
代码下载,仅供参考如有错误 请指出:
UWB实现.7z
(6.39 KB, 下载次数: 21)
|