基于频率滑动广义互相关的信号时延估计方法(MATLAB R2018A)

广义互相关(Generalized Cross-Correlation, GCC)方法是一种改进的互相关分析技术,用于更准确地估计信号的时间延迟。这种方法特别适用于噪声环境中的时延估计,因为它通过特定的加权处理提高了互相关函数的峰值的显著性,从而更容易准确地确定时延。

提出一种基于频率滑动广义互相关的信号时延估计方法,压缩包=程序+数据+参考文献。

demo代码如下:

clear all; 
set(0,'defaulttextinterpreter','latex')
close all;

load teo4.mat

x1 = x(:,4);
x2 = x(:,1);

SNR = 25;
Px = 0.5*(mean([x1(:); x2(:)].^2));
Pn = Px*10^(-SNR/10);

rng('default')
x2 = x2 + sqrt(Pn)*randn(size(x2));
x1 = x1 + sqrt(Pn)*randn(size(x1));

trueTDOA = 92;
%% Short-Time Windowing
wlen = 2048;
hop = 512;
w = hann(wlen);

x1ef = enframe(x1,w,hop).';
x2ef = enframe(x2,w,hop).';

%% Compute FS-GCC for three speech frames (39, 35 and 55)
Nfft = 2048;
B = 128;
M = 32;

ntest = [39, 35, 55];
Ntest = length(ntest);


for n = 1:Ntest
    
    
    %% Compute FS-GCC Matrix
    xinput = [x1ef(:,ntest(n)), x2ef(:,ntest(n))];
    [FSGCCmat,lags,tpwin] = msrpfsgcc(xinput,Nfft,B,M);
    
    
    figure(1), subplot(3,4,(n-1)*4+1);
    imagesc(lags,[],abs(FSGCCmat.'));
    xticks([-200 -100 0 100 200])    
    pbaspect([1 1 1])
    xlim([-200 200])
    xlabel('$\tau$')
    ylabel('$l$');
    if n == 1 
        title({'FS-GCC','','$|\mathbf{R}|^{T}$'});
    else
        title('$|\mathbf{R}|^{T}$');
    end
    
    
    %% Compute Conventional GCC-PHAT
    
    GCC = fftshift(real(ifft(exp(1i*angle(fft(xinput(:,1),Nfft).*conj(fft(xinput(:,2),Nfft)))))));    
    figure(1), subplot(3,4,(n-1)*4+2);
    GCCn = GCC/max(GCC);
    plot(lags,GCCn);
    hold on, line([trueTDOA trueTDOA],[min(GCCn) 1],'color','red');
    axis tight;    
    xlim([-200 200])
    xticks([-200 -100 0 100 200])    
    pbaspect([1 1 1])
    xlabel('$\tau$')
    if n == 1
        title({'Conventional GCC-PHAT','',''});
    end
    
    %% Compute SVD FS-GCC
    
    [GCCsvd,lags] = getsvdfsgcc(FSGCCmat,200);
    figure(1), subplot(3,4,(n-1)*4+3);
    GCCsvdn = GCCsvd/max(GCCsvd);
    plot(lags,GCCsvdn);
    hold on, line([trueTDOA trueTDOA],[min(GCCsvdn) 1],'color','red');
    axis tight;
    pbaspect([1 1 1])
    xlabel('$\tau$')
    if n == 1
        title({'SVD FS-GCC','',''});
    end
    
    %% Compute WSVD FS-GCC
    
    [GCCwsvd,lags] = getwsvdfsgcc(FSGCCmat,tpwin,200);
    figure(1), subplot(3,4,(n-1)*4+4);
    GCCwsvdn = GCCwsvd/max(GCCwsvd);
    plot(lags,GCCwsvdn);
    hold on, line([trueTDOA trueTDOA],[min(GCCwsvdn) 1],'color','red');
    axis tight;
    pbaspect([1 1 1])
    xlabel('$\tau$')
    if n == 1
        title({'WSVD FS-GCC','',''});
    end
    
    
end

程序出图如下:

基于频率滑动广义互相关的信号时延估计方法(MATLAB R2018A)_第1张图片

工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

你可能感兴趣的:(信号处理,matlab,算法,开发语言)