分享一些我在學習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)
2021-10-20 17:03 上傳
點擊文件名下載附件
書中關于UWB定位部分的代碼
|