先初始化各个参数
A = figure();
N = 250;
len = {};%用来储存标签
pslr = [];%用来储存各个pslr值
wide_3dB = [];%用来储存各个3dB带宽值
其中,{}与[]的区别是:
[]用来储存矩阵和向量,每一个[]是一个矩阵或一个向量,{}用来储存cell型数组等,比如字符、矩阵等。
若用[],则最后在输入标签时,会只有一个标签,因为只有一个矩阵,若用{},则其中会有多个字符,可以正常显示标签。
for i = 0:1:6
idx=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:30
idx=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];
end
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窗');
% 画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 on
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
function[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取值范围的趋势几乎一致。
参考代码:
https://blog.csdn.net/zhoubanlu4/article/details/106535278