Math 将线性音频分布转换为对数/感知分布?

Math 将线性音频分布转换为对数/感知分布?,math,audio,logarithm,beep,Math,Audio,Logarithm,Beep,我正在为脚本创建一些音频提示,并不断遇到相同的问题: 人类的感知是对数的。如果我想把一系列声音分成10个相等的部分,我不能从最高音高中减去最低音高再除以10。这些步骤在感知上并不准确 那么,当处理一个输出在20-20000范围(kHz)的函数时,是否有一个基本的数学函数合理地近似这些数字到它们的感知等价物的转换——同时仍然映射在20-20000范围内 例如: 我正在处理一个以kHz为范围的“嘟嘟”命令 我从自己的系统测试中了解到,该命令在被测试系统上的功能范围为38至9900Hz 因此,如果我要

我正在为脚本创建一些音频提示,并不断遇到相同的问题:

人类的感知是对数的。如果我想把一系列声音分成10个相等的部分,我不能从最高音高中减去最低音高再除以10。这些步骤在感知上并不准确

那么,当处理一个输出在20-20000范围(kHz)的函数时,是否有一个基本的数学函数合理地近似这些数字到它们的感知等价物的转换——同时仍然映射在20-20000范围内

例如:

我正在处理一个以kHz为范围的“嘟嘟”命令

我从自己的系统测试中了解到,该命令在被测试系统上的功能范围为38至9900Hz

因此,如果我要创建一个音频倒计时来遍历100个项目,我会将9900-38/100划分为每个项目98.62Hz的范围。如果我要创建一个音频倒计时,我只需创建一个从最大范围开始的蜂鸣音序列,每蜂鸣音减少98.62Hz

但这听起来并不准确。大部分时间都花在高音频率上。没有足够的时间花在低频上

我确实为我的白噪声发生器修复了这个问题,但我不能将同样的修复应用于音频倒计时。(主要是因为在白噪声发生器中有很大的出错余地。)在这种情况下,我简单地用Hz除以10。但我这样做是随机的。它给了我想要的效果,但没有任何一致的映射函数:

        if  %@RANDOM[1,10] gt 6 (set BEEP_FREQUENCY_TEMP=%@FLOOR[%@EVAL[BEEP_FREQUENCY_TEMP / 10]] 
        if  %@RANDOM[1,10] gt 9 (set BEEP_FREQUENCY_TEMP=%@FLOOR[%@EVAL[BEEP_FREQUENCY_TEMP / 10]] 
        if  %@RANDOM[1,10] gt 8 (set BEEP_FREQUENCY_TEMP=%@FLOOR[%@EVAL[BEEP_FREQUENCY_TEMP / 10]]

你能告诉我我甚至不知道如何提问吗?

你需要使用对数间距:

// start - start frequency
// stop - stop frequency
// n - the point which you wish to compute (zero based)
// N - the number of points over which to divide the frequency
// range.
double logspace(double start, double stop, int n, int N)
{
    return start * pow(stop/start, n/(double)(N-1));
}
例如:

logspace(20, 200000, 0, 4) = 20
logspace(20, 200000, 1, 4) = 200
logspace(20, 200000, 2, 4) = 2000
logspace(20, 200000, 3, 4) = 20000

注意
logspace(x,y,0,N)
可能不完全等于
x
logspace(x,y,N-1,N)
可能不完全等于
y
。这是由于浮点精度和舍入误差造成的。

正如您所知,从一个音调到一个高一个八度的音调会使其频率加倍。从那里开始,又多了一个倍频程。所以你得到的是一个线性增加(每八度增加1个,或每半音增加1/12个),以2为基数的指数:

f=440Hz·2x

现在,将可能的x值范围划分为规则的间隔,您应该这样做。要将频率f转换为音高x,需要计算一个对数,即


x=log2(f/440Hz)=ln(f/440Hz)/ln(2)

我最后查找了一个与音符匹配的所有频率的列表,制作了一个包含所有这些频率的lit的文本文件,并以我想要的任何间隔简单地迭代它。例如,如果我想要一个表示上传进度为10%的便笺,它将获取总行数,并获取文件中10%的行数。这解决了让我的音频倒计时听起来是线性的问题,即使这样做所需的频率不是线性的

查找表

不优雅,但有效