DOA估计2源时延估计均匀阵列

信息处理 matlab 互相关 估计 峰值检测
2022-02-12 18:39:05

我是信号处理的新手,如果问题是超凡的,很抱歉。我在这方面花费的时间比我承认的要多,并且找不到错误。

我有两个三角波,它们以线性均匀阵列从扬声器和 M 传感器发出。我需要估计单个传感器中单波的延迟。

我通过数学了解我必须使用相关性,但是当我在 Matlab 中实现它时,我显然犯了一些错误,并得到一个只有一个峰值的相关性,在信号的中心(及时)。

我不认为我可以添加图片,因为我对此没有任何声誉,我希望问题很清楚。

编辑:显然我可以,所以这是每个传感器的延迟每个传感器的延迟

在Matlab中,我基本上是这样做的,传感器接收到的信号在xcorr(X(:,sensor),temp)哪里,即从两个源接收到的信号加上一个小的高斯误差,是两个源发出的三角形信号。X(:,sensor)temp

为什么互相关只有一个峰值而不是两个?

编辑:完整代码

clear all
clc
% close all
%dati
v=350;%metri/sec
xa=1; %metri
ya=8;
xb=9;
yb=8;
spazio=0.25;%spazio intra sensori
spt=12.5*10^-3;%secondi 
M=41;

%ipotesi
sig=1/10;


%distanze trasmettitore/microfoni
indic_min_dista=xa/spazio+1;%5
indic_min_distb=xb/spazio+1;%37

da=zeros(M,1); %vettore delle distanze
for i=(indic_min_dista):M
    da(i)=sqrt(ya^2+(spazio*(i-indic_min_dista))^2);
end

for i=1:(indic_min_dista -1)
    da(i)=sqrt(ya^2+(spazio*(indic_min_dista-i))^2);
end

db=zeros(M,1); %vettore delle distanze
for i=(indic_min_distb):M
    db(i)=sqrt(yb^2+(spazio*(i-indic_min_distb))^2);
end

for i=1:(indic_min_distb -1)
    db(i)=sqrt(yb^2+(spazio*(indic_min_distb-i))^2);
end
%tempo trasmettitore/microfoni

ta=zeros(M,1); %vettore dei tempi
for i=1:M
    ta(i)=da(i)/v;
end

tb=zeros(M,1); %vettore dei tempi
for i=1:M
    tb(i)=db(i)/v;
end
% ta-(fliplr(tb'))'==0 i tempi sono = se letti dagli estremi opposti
%vettore dei tempi di campionamento

win=10^-3;%secondi 
N=ceil((max(ta)+2*spt)/win)+1;
% N=ceil((max(tb)+2*spt)/win)+1; sono = la situazione è del ttt simmetrica

samples=zeros(N,1);
for i=0:(N-1)
    samples(i+1)=-spt + win*(i);
end
rit=+spt+samples;

%segnale inviato
S=zeros(N,M);
temp=zeros(N,1);
for i =0:(N-1)
    for j=1:M


        if((samples(i+1)>ta(j)-spt) && (samples(i+1)<=ta(j)))
            S(i+1,j)=S(i+1,j)+1-abs(samples(i+1)-ta(j))/spt;
            if(j==1)
            temp(i+1)=+1-abs(samples(i+1)-ta(j))/spt;
            end
        end

        if((samples(i+1)>tb(j)-spt) && (samples(i+1)<=tb(j)))
            S(i+1,j)=S(i+1,j)+1-abs(samples(i+1)-tb(j))/spt;
        end

        if((samples(i+1)>ta(j)) && (samples(i+1)<=ta(j)+spt))
            S(i+1,j)=S(i+1,j)+1-abs(samples(i+1)-ta(j))/spt;
            if(j==1)
            temp(i+1)=+1-abs(samples(i+1)-ta(j))/spt;
            end
        end

        if((samples(i+1)>tb(j)) && (samples(i+1)<=tb(j)+spt))
            S(i+1,j)=S(i+1,j)+1-abs(samples(i+1)-tb(j))/spt;
        end        
    end
end

figure
imagesc(0:41,rit,S)
xlabel('Sensori');%\sigma^2_\omega
ylabel('Ritardo [s]');


W=zeros(N,M);


%costruisco W
for i =1:N
    for j=1:M
        W(i,j)=normrnd(0,sig);
    end
end


X=W+S;

%vettore che uso per calcolo correlazioni
vv=find(temp~=0);
temp=temp(min(vv): max(vv));


%%
figure
imagesc(0:41,rit,X)
xlabel('Sensori');%\sigma^2_\omega
ylabel('Ritardo [s]');
figure
surf(S)
set(gca,'xlim',[0 41])
xlabel('Sensori'), ylabel('Ritardo [s]');

% ticklabels = get(gca,'YTickLabel');
newTicklabels = rit;%[ticklabels(2:end,:);'60'];
set(gca,'YTickLabel',newTicklabels);

figure
surf(X)
xlabel('Sensori'), ylabel('Ritardo [s]');

% ticklabels = get(gca,'YTickLabel');
newTicklabels = rit;%[ticklabels(2:end,:);'60'];
set(gca,'YTickLabel',newTicklabels);
set(gca,'xlim',[0 41])
set(gca,'zlim',[0 2])

%%
clc
% close all
% Stima ritardo per ogni sensore, in funzione di sigma^2
% valuta MSE cfr CRB almeno m=10 e y=5m,

sig=1/100;%[1/10 1/5 1/2];
Nrun=100;
%segnale vero S(:,41)
%segnale registrato X(:,41)
MSEA=zeros(M,length(sig));
MSEB=zeros(M,length(sig));
mediaA=zeros(M,length(sig));
mediaB=zeros(M,length(sig));

W=zeros(N,M);
psi=(-N:N)*win;%mi serve per valutare phi nella differenza tra i tau

for nrun=1:Nrun
        ia =zeros(length(sig),M); %indici del massimo della funzione di correlazione
        ib =zeros(length(sig),M); %indici del massimo della funzione di correlazione
        for k=1:length(sig)
            %costruisco W
            for i =1:N
                for j=1:M
                    W(i,j)=normrnd(0,sig(k));
                end
            end
            X=W+S;
            for sensor=41:41
                phisx=zeros(N+1,1);
                phiss=zeros(length(psi),1);%N*2+1
                    corrtemp=xcorr(X(:,sensor),temp);
                    figure
                    plot(corrtemp)
            end
        end
end

EDIT 比较两个传感器(一个在一侧,一个在蓝色一个)和中央一个(绿线)中接收到的信号,红线对应于原始三角波。

比较

编辑三角波和接收信号之间的相关性

在此处输入图像描述

回答问题,这是硬件定位。请记住我不是艺术专业的:D

在此处输入图像描述

2个回答

您看到的相关性看起来正确 - 您看到的相关性是两个太宽而无法解决的“峰值”的叠加。看看这个例子:

%pulses
fs = 10e3;
t1 = -0.1:1/fs:0.1;
t2 = t1 + 100/fs;
w = 40e-3;

%generate two triangular pulses
x = tripuls([t1', t2'],w);

% compute cross correlation
y = [xcorr(x(:,1),x(:,1)) xcorr(x(:,2),x(:,1))];

% plot cross correlation
figure; subplot(3,1,1);
plot(y);
subplot(3,1,2);
plot(sum(y,2));
subplot(3,1,3);
plot(xcorr(sum(x,2),x(:,1)));

使用卷积而不是相关性,您将获得与延迟时间的 ML 估计器相对应的两个峰值。