@@ -73,6 +73,11 @@ float SimpleDb(float energy) {
73
73
74
74
void FinalizeDb (hwy::AlignedNDArray<float , 2 >& channels, float mul,
75
75
size_t out_ix) {
76
+ float masker_down[kNumRotators ];
77
+ for (int k = 0 ; k < kNumRotators ; ++k) {
78
+ float v = SimpleDb (mul * channels[{out_ix}][k]);
79
+ channels[{out_ix}][k] = Loudness (k, v);
80
+ }
76
81
double masker = 0.0 ;
77
82
static const double octaves_in_20_to_20000 = log (20000 /20 .)/log (2 );
78
83
static const double octaves_per_rot =
@@ -100,19 +105,18 @@ void FinalizeDb(hwy::AlignedNDArray<float, 2>& channels, float mul,
100
105
static const float temporal0 = 0.09979167061501665 ;
101
106
static const float temporal1 = 0.14429505133534495 ;
102
107
static const float temporal2 = 0.009228598592129168 ;
103
- static float weightp = 0.1792443302507868 ;
104
- static float weightm = 0.7954490998745948 ;
108
+ static const float weightp = 0.1792443302507868 ;
109
+ static const float weightm = 0.7954490998745948 ;
105
110
106
- static float mask_k = 0.08709005149742773 ;
111
+ static const float mask_k = 0.08709005149742773 ;
107
112
108
113
// Scan frequencies from bottom to top, let lower frequencies to mask higher frequencies.
109
114
// 'masker' maintains the masking envelope from one bin to next.
110
- static const float temporal_masker0 = 0.13104546362447728 ;
111
- static const float temporal_masker1 = 0.09719740670406614 ;
112
- static const float temporal_masker2 = -0.03085233735225447 ;
113
-
114
115
for (int k = 0 ; k < kNumRotators ; ++k) {
115
- float v = SimpleDb (mul * channels[{out_ix}][k]);
116
+ float v = channels[{out_ix}][k];
117
+ if (out_ix != 0 ) {
118
+ v = (1.0 - mask_k) * v + mask_k * channels[{out_ix - 1 }][k];
119
+ }
116
120
if (v < min_limit) {
117
121
v = min_limit;
118
122
}
@@ -123,12 +127,10 @@ void FinalizeDb(hwy::AlignedNDArray<float, 2>& channels, float mul,
123
127
if (masker < v2) {
124
128
masker = v2;
125
129
}
126
- float mask = masker - masker_gap_up;
127
-
130
+ float mask = fraction_up * masker - masker_gap_up;
128
131
if (v < mask) {
129
132
v = maskingStrengthUp * mask + (1.0 - maskingStrengthUp) * v;
130
133
}
131
-
132
134
channels[{out_ix}][k] = v;
133
135
if (3 * k < kNumRotators ) {
134
136
masker -= masker_step_per_rot_up_0;
@@ -143,33 +145,46 @@ void FinalizeDb(hwy::AlignedNDArray<float, 2>& channels, float mul,
143
145
masker = 0.0 ;
144
146
for (int k = kNumRotators - 1 ; k >= 0 ; --k) {
145
147
float v = channels[{out_ix}][k];
148
+ if (out_ix != 0 ) {
149
+ v = (1.0 - mask_k) * v + mask_k * channels[{out_ix - 1 }][k];
150
+ }
146
151
float v2 = (1 - down_blur) * v2 + down_blur * v;
147
152
if (k == kNumRotators - 1 ) {
148
153
v2 = v;
149
154
}
150
155
if (masker < v) {
151
156
masker = v;
152
157
}
153
- float mask = masker - masker_gap_down;
158
+ float mask = fraction_down * masker - masker_gap_down;
154
159
if (v < mask) {
155
160
v = maskingStrengthDown * mask + (1.0 - maskingStrengthDown) * v;
156
161
}
157
162
channels[{out_ix}][k] = v;
158
163
masker -= masker_step_per_rot_down;
159
164
}
160
- for (int k = 0 ; k < kNumRotators ; ++k) {
161
- channels[{out_ix}][k] = Loudness (k, channels[{out_ix}][k]);
162
- }
163
165
// temporal masker
164
166
if (out_ix >= 3 ) {
165
167
for (int k = 0 ; k < kNumRotators ; ++k) {
166
- float v0 = (channels[{out_ix - 1 }][k] - channels[{out_ix}][k]);
167
- float v1 = (channels[{out_ix - 2 }][k] - channels[{out_ix}][k]);
168
- float v2 = (channels[{out_ix - 3 }][k] - channels[{out_ix}][k]);
169
-
170
- channels[{out_ix}][k] -= temporal_masker0 * v0 +
171
- temporal_masker1 * v1 +
172
- temporal_masker2 * v2;
168
+ float m = (temporal0 * channels[{out_ix - 1 }][k] +
169
+ temporal1 * channels[{out_ix - 2 }][k] +
170
+ temporal2 * channels[{out_ix - 3 }][k]) / (temporal0 + temporal1 + temporal2);
171
+ if (m > channels[{out_ix}][k]) {
172
+ channels[{out_ix}][k] -= weightp * (m - channels[{out_ix}][k]);
173
+ } else {
174
+ channels[{out_ix}][k] -= weightm * (m - channels[{out_ix}][k]);
175
+ }
176
+ /*
177
+ // todo(jyrki): explore with this
178
+ static const float temporal_masker0 = 0.1387454636244773;
179
+ channels[{out_ix}][k] -=
180
+ temporal_masker0 * (channels[{out_ix - 1}][k] - channels[{out_ix}][k]);
181
+ static const float temporal_masker1 = 0.08715440670406614;
182
+ channels[{out_ix}][k] -=
183
+ temporal_masker1 * (channels[{out_ix - 2}][k] - channels[{out_ix}][k]);
184
+ static const float temporal_masker2 = -0.03785233735225447;
185
+ channels[{out_ix}][k] -=
186
+ temporal_masker2 * (channels[{out_ix - 3}][k] - channels[{out_ix}][k]);
187
+ */
173
188
}
174
189
}
175
190
}
0 commit comments