1
1
function specGlobal = doa_music(x ,Param ,nsrc )
2
2
if (size(x ,2 )<2)
3
- error(' ERROR[MUSIC]:信号通道数必须大于等于2' );
3
+ error(' ERROR[MUSIC]:信号通道数必须大于等于2' );
4
4
end
5
5
%% STFT
6
6
X = ssl_stft(x .' ,Param .window ,Param .noverlap ,Param .nfft ,Param .fs );% nbin,nfram,nchan
7
7
X = X(2 : end ,: ,: );
8
8
X = X(Param .freqBins ,: ,: );
9
9
[nbin ,~ ,nmic ] = size(X );
10
10
%% MUSIC
11
- % power = zeros(nbin, length(Param.azimuth)*length(Param.elevation));
12
- % for ibin = 1:nbin % 对于每个频点
13
- % Rxx = (transpose(squeeze(X(ibin,:,:)))*conj(squeeze(X(ibin,:,:))));% 自相关矩阵
14
- % [U,~,~] = svd(Rxx); % SVD分解 Rxx = U * S * U^H
15
- % En = U(:,nsrc+1:end); % 噪声子空间
16
- % fprintf('%d\n',ibin)
17
- % idx = 1;
18
- % for iel = 1 : length(Param.elevation)%1 : length(Param.azimuth)
19
- % for iaz = 1 : length(Param.azimuth)%1 : length(Param.elevation)
20
- % % v为声源方向的单位向量,见鄢社锋书,需要注意的是,本程序的方位角与俯仰角与书中定义不同
21
- % v = [cosd(Param.elevation(iel))*cosd(Param.azimuth(iaz));cosd(Param.elevation(iel))*sind(Param.azimuth(iaz));sind(Param.elevation(iel))];% 3 x 1
22
- % tau = v'*(Param.micPos-repmat(Param.micPos(:,1),[1,nmic]))./Param.c; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
23
- % a = exp(1i*2*pi*Param.f(ibin).*transpose(tau));%nmic x 1 SV = exp(-2*1i*pi*tau*Param.f.'); % nmic x nbin
24
- % power(ibin,idx) = 1./(sum(abs( ctranspose(a) * En * ctranspose(En) * a )));
25
- % idx = idx+1;
26
- % end
27
- % end
28
- % end
29
- % linspace包含端点,保证插值时不会出现NaN
11
+ % linspace包含端点,保证插值时不会出现NaN
30
12
aziGrid = linspace(Param .azimuth(1 ),Param .azimuth(end ),round((Param .azimuth(end )-Param .azimuth(1 ))/Param .alphaRes )+1 );
31
13
eleGrid = linspace(Param .elevation(1 ),Param .elevation(end ),round((Param .elevation(end )-Param .elevation(1 ))/Param .alphaRes )+1 );
32
14
power = zeros(nbin , length(aziGrid ), length(eleGrid ));
33
15
34
- for ibin = 1 : nbin % 对于每个频点
35
- Rxx = (transpose(squeeze(X(ibin ,: ,: )))*conj(squeeze(X(ibin ,: ,: ))));% 自相关矩阵
36
- [U ,~ ,~ ] = svd(Rxx ); % SVD分解 Rxx = U * S * U^H
37
- En = U(: ,nsrc + 1 : end ); % 噪声子空间
16
+ for ibin = 1 : nbin % 对于每个频点
17
+ Rxx = (transpose(squeeze(X(ibin ,: ,: )))*conj(squeeze(X(ibin ,: ,: ))));% 自相关矩阵
18
+ [U ,~ ,~ ] = svd(Rxx ); % SVD分解 Rxx = U * S * U^H
19
+ En = U(: ,nsrc + 1 : end ); % 噪声子空间
38
20
fprintf(' %d\n ' ,ibin )
39
21
for iaz = 1 : length(aziGrid )
40
22
for iel = 1 : length(eleGrid )
41
23
v = [cosd(eleGrid(iel ))*cosd(aziGrid(iaz ));cosd(eleGrid(iel ))*sind(aziGrid(iaz ));sind(eleGrid(iel ))];% 3 x 1
42
- tau = v ' *(Param .micPos - repmat(Param .micPos(: ,1 ),[1 ,nmic ]))./Param .c ; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
24
+ tau = v ' *(Param .micPos - repmat(Param .micPos(: ,1 ),[1 ,nmic ]))./Param .c ; % 1 * nmic 参考麦克为1:Param.micPos(:,1)
43
25
a = exp(1i * 2 * pi * Param .f(ibin ).*transpose(tau ));% nmic x 1 SV = exp(-2*1i*pi*tau*Param.f.'); % nmic x nbin
44
26
power(ibin ,iaz ,iel ) = 1 ./(sum(abs( ctranspose(a ) * En * ctranspose(En ) * a )));
45
27
end
46
28
end
47
29
end
48
30
49
- % 对所有频率的空间谱加在一起:
31
+ % 对所有频率的空间谱加在一起:
50
32
spec = squeeze(sum(power ,1 )); % nAzi x nEle
51
33
[az ,el ]=meshgrid(aziGrid ,eleGrid );
52
34
[azi ,eli ]=meshgrid(Param .azimuth ,Param .elevation );
71
53
X(: ,: ,ichan ) = spectrogram(x(ichan ,: ),window ,noverlap ,nfft ,fs );
72
54
end
73
55
74
- end
56
+ end
0 commit comments