function [IL_linear, IL_dB] = myIL (x, y, plotEnable) %% 计算积分电平 % 2026.1.11 2A438 % 自己动手编写的波形的互相关的IL积分旁瓣电平、PIL积分电平 % 输入: % x: 输入信号1 % y: 输入信号2 % mlb: 主瓣宽度,主瓣一半的宽度 % 输出: % ISL_linear:ISL输出,以线性值 % ISL_dB: 以dB值输出 base =(x')*x; %以x的2范数的平方作为基准,所以输入xy的时候需要注意顺序,它决定了归一化的基准值 N = length(x); %输入信号的长度为N,那么自相关序列的长度为2N+1 ccf = xcorr(x,y); %计算互相关函数 ccf_norm = ccf/base; %对自相关函数进行归一化 ccf_power = abs(ccf_norm).^2; %能量值,这里取了平方 % 计算IL能量 IL = sum(ccf_power); %积分总能量 IL_linear = IL; %积分旁瓣电平,这里以主瓣能量 IL_dB = 10*log10(IL_linear); %dB值表示的积分旁瓣电平 ccd_ind = (-N+1):(N-1); %自相关函数的延迟取值范围 if plotEnable == 1 fprintf('=== ISL计算示例 ===\n'); fprintf('IL积分能量线性值: %.4f\n', IL_linear); fprintf('IL积分能量(dB): %.4f\n', IL_dB); averagePower = sum(abs(ccf_norm))/(2*N-1); %平均能量 averLine = ones(1,2*N-1).*averagePower; figure; plot(ccd_ind, 20*log10(abs(ccf_norm) + eps), 'linewidth',1); %加上eps可以防止太小的值 hold on; plot(ccd_ind, 20*log10(averLine),'b--', 'linewidth',1); %加上eps可以防止太小的值 axis tight; title(sprintf('互相关函数\n积分电平IL = %.2fdB, 峰值旁瓣电平PSL = %.2fdB',IL_dB)); legend('自相关值','平均值'); end