先初始化各个参数
A = figure();N = 250;len = {};%用来储存标签pslr = [];%用来储存各个pslr值wide_3dB = [];%用来储存各个3dB带宽值
其中,{}与[]的区别是:
[]用来储存矩阵和向量,每一个[]是一个矩阵或一个向量,{}用来储存cell型数组等,比如字符、矩阵等。
若用[],则最后在输入标签时,会只有一个标签,因为只有一个矩阵,若用{},则其中会有多个字符,可以正常显示标签。
for i = 0:1:6idx=num2str(i);figure(A);hold on;z = kaiser(N,i);plot(kaiser(N,i),'LineWidth',1);xlim([-10 260]);
构造kaiser窗,idx为转换为字符串形式的数字,为了输出标签时比较简便。
can = fft( z, 100*N ); can = abs(can);can = 20.*log10( can./max(can) );can = fftshift( can );can1 = fft( z, 100*N );can1 = abs((can1).^2);can1 = 20.*log10( can1./max(can1) );can1 = fftshift( can1 );
进行傅里叶变换,转换成用分贝形式表示。can1为功率,即使用平方,用来获得峰值旁瓣功率。
len = [len,['β=',idx]];pslr = [pslr,getpslr(can)];[t,t_r_location,t_l_location] = wide(can1);wide_3dB = [wide_3dB,t];
得到数据标签、pslr值、以及3dB宽度值。
figure(2); subplot(1,2,1);plot( 0:6,( wide_3dB./wide_3dB(1) - 1 ));xlabel('kaiser窗的β'); ylabel('展宽比'); title('3dB宽度展宽比')grid on
绘制3dB宽度图像,其中第一个值为最小值,除最小值再减一可进行对其归一化。这里的单位为dB,若需要准确宽度需要乘一个窗长度,即时间T。
figure(2); subplot(1,2,2);plot( 0:6, pslr );xlabel('kaiser窗的β'); ylabel('PSLR,dB'); title('峰值旁瓣比(PSLR)')grid on
绘制峰值旁瓣比,这里pslr是小于1的值,所以不需要归一化。
figure(A);hold on;plot(kaiser(N,2.5),'LineWidth',2,'color','red');xlim([-10 260]);len = [len,['β=2.5']];legend(len');xlabel('kaiser窗的β'); title('不同β值的kaiser窗');
绘制一般使用的最佳β值2.5的kaiser窗,将所有的kaiser窗绘制在一起。
function [t,t_r_location,t_l_location] = wide(a)[m,max_location] = max(a);[r,t_r_location] = min(abs(a(max_location:end)+3));[l,t_l_location] = min(abs(a(1:max_location)+3));t_r_location = t_r_location + max_location - 1;t = t_r_location - t_l_location;end
这里构造计算3dB宽度的函数,首先得到a中的最大值的位置,然后计算左侧最接近3dB宽度的位置,再计算右侧最接近3dB宽度的位置,右侧位置需要加上最大值位置减1才可以得到相对整个矩阵的位置。最后右侧位置减左侧位置即为3dB宽度。
这里输入的a矩阵需要是归一化后的用dB来表示的值。
function[k] = getpslr(a)p = findpeaks(a);p = sort(p,'descend');k = p(2);end
构造计算峰值旁瓣比的函数。先找出所有的峰值点,然后降序排序,选出第二个值,这里因为已经归一化,所以不需要除去主瓣最大值,因为主瓣最大值即为1。
完整代码如下:
A = figure();N = 250;len = {};pslr = [];wide_3dB = [];for i = 0:1:30idx=num2str(i);figure(A);hold on;z = kaiser(N,i);plot(kaiser(N,i),'LineWidth',1);xlim([-10 260]);can = fft( z, 100*N ); can = abs(can);can = 20.*log10( can./max(can) );can = fftshift( can );len = [len,['β=',idx]];pslr = [pslr,getpslr(can)];can1 = fft( z, 100*N );can1 = abs((can1).^2);can1 = 20.*log10( can1./max(can1) );can1 = fftshift( can1 );[t,t_r_location,t_l_location] = wide(can1);wide_3dB = [wide_3dB,t];endfigure(A);hold on;plot(kaiser(N,2.5),'LineWidth',2,'color','red');xlim([-10 260]);len = [len,['β=2.5']];legend(len');xlabel('kaiser窗的β'); title('不同β值的kaiser窗');% 画3dB宽度展宽比q = wide_3dB./wide_3dB(1)-1;figure(2); subplot(1,2,1);plot( 0:30,100*q);xlabel('kaiser窗的β'); ylabel('展宽比'); title('3dB宽度展宽比')grid on% 画峰值旁瓣比figure(2); subplot(1,2,2);plot( 0:30, pslr );xlabel('kaiser窗的β'); ylabel('PSLR,dB'); title('峰值旁瓣比(PSLR)')grid onfunction [t,t_r_location,t_l_location] = wide(a)[m,max_location] = max(a);[r,t_r_location] = min(abs(a(max_location:end)+3));[l,t_l_location] = min(abs(a(1:max_location)+3));t_r_location = t_r_location + max_location - 1;t = t_r_location - t_l_location;endfunction[k] = getpslr(a)p = findpeaks(a);p = sort(p,'descend');k = p(2);end
结果图如下:
图2.11
图2.12
乘上时间宽度T后的图2.12
与书中图一致。
将β的取值延展到1到30后,曲线更加平滑且趋势与1到6取值范围的趋势几乎一致。
参考代码:
/zhoubanlu4/article/details/106535278
合成孔径雷达成像——算法与实现图【2.11】与【2.12】仿真——不同β值下的kaiser窗 以及3dB宽度和峰值旁瓣比