2
2
3
3
addpath(genpath(' ./../' ));
4
4
addpath(' ./wav files' );
5
- %% Input File & Mic config
6
- fileName = ' male_female_mixture .wav' ;
5
+ %% 音频文件和传声器位置坐标
6
+ fileName = ' example .wav' ;
7
7
micPos = ...
8
8
...% mic1 mic2 mic3 mic4 mic5 mic6 mic7 mic8
9
9
[ 0.037 - 0.034 - 0.056 - 0.056 - 0.037 0.034 0.056 0.056 ; % x
10
10
0.056 0.056 0.037 - 0.034 - 0.056 - 0.056 - 0.037 0.034 ; % y
11
11
- 0.038 0.038 - 0.038 0.038 - 0.038 0.038 - 0.038 0.038 ]; % z
12
12
13
13
14
- azBound = [-180 180 ]; % 方位角搜索范围
15
- elBound = [-90 90 ]; % 俯仰角搜索范围。若只有水平面:则elBound=0;
16
- gridRes = 1 ; % 方位角/俯仰角的分辨率
17
- alphaRes = 5 ; % Resolution (? of the 2D reference system defined for each microphone pair
14
+ azBound = [-180 180 ]; % 方位角搜索范围
15
+ elBound = [-90 90 ]; % 俯仰角搜索范围。若只有水平面:则elBound=0;
16
+ gridRes = 1 ; % 方位角/俯仰角的分辨率
17
+ alphaRes = 5 ; % 分辨率
18
18
19
- % method = 'SRP-PHAT';
20
- % method = 'SNR-MVDR';
21
- % method = 'SNR-FWMVDR';
22
19
method = ' MUSIC' ;
23
20
wlen = 512 ;
24
21
window = hann(wlen );
25
22
noverlap = 0.5 * wlen ;
26
23
nfft = 512 ;
27
- nsrc = 2 ; % 声源个数
28
- c = 343 ; % 声速
29
- freqRange = []; % 计算的频率范围 []为所有频率
30
- pooling = ' max' ; % 如何聚合各帧的结果:所有帧取最大或求和{'max' 'sum'}
31
- %% 读取音频文件(fix)
24
+ nsrc = 2 ; % 声源个数
25
+ c = 343 ; % 声速
26
+ freqRange = []; % 计算的频率范围 []为所有频率
27
+ pooling = ' max' ; % 如何聚合各帧的结果:所有帧取最大或求和{'max' 'sum'}
28
+
29
+ %% 读取音频文件(fix)
32
30
[x ,fs ] = audioread(fileName );
33
- [nSample ,nChannel ]= size(x );
34
- if nChannel > nSample , error(' ERROR:输入信号为nSample x nChannel' ); end
31
+ [nSample ,nChannel ] = size(x );
32
+ if nChannel > nSample , error(' ERROR:输入信号为nSample x nChannel' ); end
35
33
[~ ,nMic ,~ ] = size(micPos );
36
- if nChannel ~= nMic , error(' ERROR:麦克风数应与信号通道数相等' ); end
37
- %% 保存参数(fix)
34
+ if nChannel ~= nMic , error(' ERROR:麦克风数应与信号通道数相等' ); end
35
+ %% 保存参数(fix)
38
36
Param = pre_paramInit(c ,window , noverlap , nfft ,pooling ,azBound ,elBound ,gridRes ,alphaRes ,fs ,freqRange ,micPos );
39
- %% 定位(fix)
37
+ %% 定位(fix)
40
38
if strfind(method ,' SRP' )
41
39
specGlobal = doa_srp(x ,method , Param );
42
40
elseif strfind(method ,' SNR' )
45
43
specGlobal = doa_music(x ,Param ,nsrc );
46
44
else
47
45
end
48
- % save('n.mat','specGlobal');
49
- % ppfSpec2D = (reshape(specGlobal,length(Param.azimuth),length(Param.elevation)))';
50
- % imagesc(ppfSpec2D)
51
- %% 计算角度
52
- minAngle = 10 ; % 搜索时两峰之间最小夹角
53
- specDisplay = 1 ; % 是否展示角度谱{1,0}
46
+
47
+ %% 计算角度
48
+ minAngle = 10 ; % 搜索时两峰之间最小夹角
49
+ specDisplay = 1 ; % 是否展示角度谱{1,0}
54
50
% pfEstAngles = post_sslResult(specGlobal, nsrc, Param.azimuth, Param.elevation, minAngle);
55
- % 绘制角谱
51
+ % 绘制角谱
56
52
% [pfEstAngles,figHandle] = post_findPeaks(specGlobal, Param.azimuth, Param.elevation, Param.azimuthGrid, Param.elevationGrid, nsrc, minAngle, specDisplay);
57
53
[pfEstAngles ,figHandle ] = post_findPeaks(specGlobal , Param .azimuth , Param .elevation , Param .azimuthGrid , Param .elevationGrid , nsrc , minAngle , specDisplay );
58
54
59
55
azEst = pfEstAngles(: ,1 )' ;
60
56
elEst = pfEstAngles(: ,2 )' ;
61
57
for i = 1 : nsrc
62
- fprintf(' Estimated source %d : \n Azimuth (Theta): %.0f \t Elevation (Phi): %.0f \n\n ' ,i ,azEst(i ),elEst(i ));
63
- end
58
+ fprintf(' 第 %d 个声源方位为 : \n Azimuth (Theta): %.0f \t Elevation (Phi): %.0f \n\n ' ,i ,azEst(i ),elEst(i ));
59
+ end
0 commit comments