声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1325|回复: 0

[综合] 如何确定FFT时延时间?

[复制链接]
发表于 2009-7-23 09:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
问题描述:
情况1:信号1在信号2之前,可准确定位时延,即程序中Nn<N1,可准确求出时延结果为N1-Nn
情况2:信号1在信号2之后,时延应是负值a,结果为正值,是信号长度L与真正时延a之和(在程序中为Nn>N1,真正时延结果为 N1 - Nn,但程序结果为L+N1—Nn)。若单纯的减去信号长度L,则当信号2在信号1之后,且时延为L+a时,这两种情况会出现混绕。
请问各位大侠,如何解决这种问题。下面是程序部分。
%% 广义自相关法时延估计函数可行性测试部分
    clc; clear all ;close all;
    wn =rand(10240,1);
    phi = [0.1:pi/180:3*pi];
    signal = 0;
    for i = 1:5
        signal = signal + 1* sin(2*i*pi*phi);%.*exp(-(2*i*pi*phi));
    end
    signal = signal/max(abs(signal));%信号归一化
    temp = zeros(10240,1);
    Nn = 1;
    temp (Nn:length(signal)+Nn-1)= signal;
    signal1 = wn +  temp;
%     plot(signal1);hold on;

    N1 = 1001 ;
    temp1 = zeros(10240,1);
    temp1(N1:N1-1+length(signal))= signal;
    wn1 =rand(10240,1);
    signal2 = wn1 +  temp1;
    plot(signal2,'r');
%%
[N ,b] = size(signal1);
D  = GCC(signal1,signal2,'scot');
msgbox(['d = ',num2str(N1-Nn)  '  D1= ',num2str(D)])%,'  D2= ',num2str(D2)]);

子函数 GCC.m
function [D,R] = GCC(Sig1,Sig2,m,Fs,frame,N)


if nargin<2
    error('Wrong number of input arguments');
elseif nargin == 2
    m = 'roth';
end


Pxx = (abs(fft(Sig1))).^2;
Pyy = (abs(fft(Sig2))).^2;
Pxy = conj(fft(Sig1)).*fft(Sig2);
N = size(Pxy,1);


% define pre-whitening filter
switch lower(m)
    case 'unfiltered'
        % Unfiltered Cross-Correlation (UCC)
        % -----------------------------------------------------------------
        % this processor doesn't filter the cross-power applying a sort of
        % time cross-correlation.
        W = ones(N,1);

    case 'roth'
        % Roth filter
        % -----------------------------------------------------------------
        % this processor suppress frequency regions where the noise is
        % large than signals.
        if size(Pxx)~=size(Pxy)
            error('Roth filter: power spectra size must be the same');
        end
        W = ones(N,1);
        nonzero = find(Pxx(:,k));
        W(nonzero,k) = 1 ./ Pxx(nonzero,k);


    case 'scot'
        % Smoothed Coherence Transform (SCOT)
        % -----------------------------------------------------------------
        % this processor exhibits the same spreading as the Roth processor.
        if size(Pxx)~=size(Pyy) | size(Pxx)~=size(Pxy) | size(Pyy)~=size(Pxy)
            error('SCOT filter: power spectra size must be the same');
        end
        W = ones(N,1);
        W_Den = (Pxx .* Pyy) .^ 0.5;
        nonzero = find(W_Den(:,k));
        W(nonzero,k) = 1 ./ W_Den(nonzero,k);
        
   
    otherwise error('Method not defined...');
end

% apply the filter
R = Pxy .* W;

% estimate the generalized cross-correlation (GCC)
G = abs(ifft(R));

D = find(G==max(G),1,'first') ;

[ 本帖最后由 sanzhxl 于 2009-7-23 09:46 编辑 ]

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-2 19:27 , Processed in 0.062578 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表