-
Notifications
You must be signed in to change notification settings - Fork 4
/
GEDI.m
90 lines (75 loc) · 3.22 KB
/
GEDI.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Gammachirp envelope distortion index (GEDI) for open software
% Objective mesure index for speech intelligibility
%
% Yamamoto
% Created : 12 Nov. 2018
%
% Inputs:
% SndTest: input signal of enhanced/unprocessed noisy speech
% SndClean: input signal of clean speech reference
% GCparam: parameters of dynamic compressive gammachirp filterbank
% (dcGC-FB)
% Conditions: parameters for a material, [k q m sigma_s fs]
% SPL: sound pressure level of input signals in dB
%
% Outputs:
% Result.
% Pcorrect: percent correct of speech intelligibility
% SDRenv: SDRenv in dB
% SDRenvsModFB: SDRenvs in all modulation filter channels
% ParamModFB: parameters of modulation filterbank
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Result = GEDI(SndTest, SndClean, GCparam, Conditions, SPL)
%% Default parameters of dcGC filterbank
if isfield(GCparam,'fs') == 0, GCparam.fs = 48000; end
if isfield(GCparam,'NumCh') == 0, GCparam.NumCh = 100; end
if isfield(GCparam,'FRange') == 0, GCparam.FRange = [100, 6000]; end
if isfield(GCparam,'OutMidCrct') == 0, GCparam.OutMidCrct = 'ELC'; end
if isfield(GCparam, 'Ctrl') == 0,GCparam.Ctrl = 'dynamic'; end % Cf: GCparam.Ctrl = 'static'; % or 'fixed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Pre-processsing for input signals
% Extract material information
fs = Conditions(5); % sampling frequency of original materials
% Time alignment
[SndTest, SndClean] = GEDI_TimeAlign(SndTest, SndClean);
% Upsampling to 48 kHz
SndTest = interp(SndTest,GCparam.fs/fs);
SndClean = interp(SndClean,GCparam.fs/fs);
% Calibrate input level of SndTest and SndClean by using Meddis hair cell level
[SndTest, ~] = Eqlz2MeddisHCLevel(SndTest, SPL);
[SndClean, ~] = Eqlz2MeddisHCLevel(SndClean, SPL);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Analyzing by dynamic compressive gammachirp filterbank
% Test signal (enhanced/unprocessed speech)
[OutdcGCTest, ~, ~, ~] = GCFBv211(SndTest',GCparam);
% Reference signal (Clean speech; S)
[OutdcGCClean, ~, ~, ~] = GCFBv211(SndClean',GCparam);
%% Main processing part of GEDI
[Pcorrect, SDRenvdB, SDRenvsModFB, ParamModFB] = GEDI_OutdcGC(OutdcGCTest, OutdcGCClean, GCparam, Conditions);
%% Outputs
Result.Pcorrect = Pcorrect; % Percent correct of speech intelligibility
Result.SDRenvdB = SDRenvdB; % SDRenv in dB
Result.SDRenvsModFB = SDRenvsModFB; % SDRenvs in all modulation filter channels
Result.ParamModFB = ParamModFB; % Parameters of modulation filterbank
end
function [OutSndTest, OutSndClean] = GEDI_TimeAlign(InSndTest, InSndClean)
%% Align signals using cross-correlation
[CorrSnd, Lag] = xcorr(InSndTest, InSndClean);
[~,IdxMaxLag] = max(CorrSnd);
TimeLag = Lag(IdxMaxLag);
if TimeLag > 0
OutSndTest = InSndTest(TimeLag:end);
LenOutSndTest = length(OutSndTest);
OutSndClean = InSndClean(1:LenOutSndTest);
elseif TimeLag < 0
OutSndClean = InSndClean(-TimeLag:end);
LenOutSndClean = length(OutSndClean);
OutSndTest = InSndTest(1:LenOutSndClean);
else
OutSndTest = InSndTest;
OutSndClean = InSndClean;
end
end