代码复现如下:
%kaiser窗傅里叶变换与3dB宽度峰值旁瓣比获取
clc
close all
clear all
N = 100;
beta = [0,1,2,3,4,5,6];
hw = [];
pslr = [];
for i = 1:7
%生成Kaiser窗
A = kaiser(N,beta(i));
%傅里叶变换
temp = fft(A,2^14);
%temp = fftshift(temp);
temp = 20*log10(abs(temp)/max(abs(temp)));
%提取3dB波束宽度
[hwn,locleft,locright] = get_hw(temp);
hw = [hw,hwn];
%提取峰值旁瓣比
[pslrn]=get_pslr(temp);
pslr=[pslr,pslrn];
end
%绘图
plot(temp)
set(figure,'position',[100,100,1200,600]);
subplot(1,2,1),plot(beta,(hw/hw(1)-1)*100)
title('(a)3dB宽度展宽比'),xlabel('Kaiser窗\beta'),ylabel('展宽比')
grid on
subplot(1,2,2),plot(beta,pslr)
title('(b)峰值旁瓣比'),xlabel('Kaiser窗\beta'),ylabel('PSLR/dB')
grid on
sgtitle('图2.12 不同Kaiser窗的展宽和峰值旁瓣比')
%hw和pslr获取函数
function [hw,locleft,locright] = get_hw(Af)
%找到Af的最大位置
[~,locmax] = max(Af);
%找到locmax左边最接近-3dB的位置
[~,locleft] = min(abs(Af(1:locmax)+3));
%找到locmax右边最接近-3dB的位置
[~,locright] = min(abs(Af(locmax:end)+3));
locright = locright+locmax-1;
hw = locright-locleft;
end
function [pslr] = get_pslr(Af)
%找到所有的peak
peaks = findpeaks(Af);
%对peaks进行排序
peaks =sort(peaks,'descend');
%得到第一旁瓣
pslr = peaks(2);
end
B = sort(___,direction)
使用上述任何语法返回按 direction
指定的顺序显示的 A
的有序元素。'ascend'
表示升序(默认值),'descend'
表示降序。
1.peaks = findpeaks(Af);
pks=findpeaks(data)返回具有输入信号向量data的局部最大值(峰值)的向量。局部峰值是大于其两个相邻样本或等于Inf的数据样本。峰值按出现顺序输出。排除非Inf信号端点。如果峰值是平的,则函数只返回具有最低索引的点。
2.peaks = sort(peaks,'descend');
B = sort(___,direction)
使用上述任何语法返回按 direction
指定的顺序显示的 A
的有序元素。'ascend'
表示升序(默认值),'descend'
表示降序。此时B为一个有序数组,B(1)为第一个元素。