我正在使用以下代码规范化PCM音频数据,这是规范化的正确方法吗?归一化后,我将应用LPF。该命令是否重要,是先执行LPF并在其输出上进行归一化,还是仅在此情况下我的当前命令更好?另外,我的targetMax设置为8000,是我在该论坛帖子中使用的。最佳值是多少?我的输入是16位MONO PCM,采样率为44100。
private static int findMaxAmplitude(short[] buffer) {
short max = Short.MIN_VALUE;
for (int i = 0; i < buffer.length; ++i) {
short value = buffer[i];
max = (short) Math.max(max, value);
}
return max;
}
short[] process(short[] buffer) {
short[] output = new short[buffer.length];
int maxAmplitude = findMaxAmplitude(buffer);
for (int index = 0; index < buffer.length; index++) {
output[index] = normalization(buffer[index], maxAmplitude);
}
return output;
}
private short normalization(short value, int rawMax) {
short targetMax = 8000;
double maxReduce = 1 - targetMax / (double) rawMax;
int abs = Math.abs(value);
double factor = (maxReduce * abs / (double) rawMax);
return (short) Math.round((1 - factor) * value);
}
最佳答案
您的findMaxAmplitude仅查看正偏移。它应该使用类似
max = (short)Math.Max(max, Math.Abs(value));
您的规范化工作似乎很复杂。一个更简单的版本将使用:
return (short)Math.Round(value * targetMax / rawMax);
targetMax 8000是否正确取决于口味。通常,我希望对16位样本进行规范化以使用值的最大范围。因此targetMax为32767似乎更合乎逻辑。
由于LPF的增益可能会改变序列的最大值,因此归一化可能应该在LPF操作之后进行。