我正在为脚本创建一些音频提示,并且一直遇到相同的问题:
人类的感知是对数的。如果我想把一系列的声音切成10个相等的部分,我不能仅仅从最高音高减去最低音高,除以10。这些步骤在感知上是不准确的。
那么,当处理一个在20-20000范围内提供输出的函数(kHz)时,是否有一个基本的数学函数可以合理地近似将这些数字转换成它们的知觉等价物--同时仍在20-20000范围内进行映射?
示例:
我正在处理一个"beep“命令,它将kHz作为一个范围。
我从我自己的系统测试中知道,在被测试的系统上,这个命令的功能范围是38到9900 to。
因此,如果我创建一个音频倒计时,通过100项,我会把9900-38 / 100分成98.62赫兹范围的每一项。如果我要创建一个音频倒计时,我会简单地创建一个从最大范围开始,降低98.62赫兹每声。
但这听起来并不准确。大部分时间都花在高音频率上。在低沉的频率上花费的时间不够。
我确实为我的白噪声发生器修复了这个,但我不能将同样的修复应用于音频倒计时。(主要是因为白噪声发生器有很大的错误余地。)在这种情况下,我只需除以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]]你能告诉我我甚至不知道怎么问我的问题吗?
发布于 2015-11-12 07:08:18
最后,我查找了一个与笔记匹配的所有频率的列表,创建了一个包含所有这些频率的文本文件,并在我想要的时间间隔内进行简单的迭代。例如,如果我想要一个指示10%上传进度的注释,它将获取总行数,并在文件中抓取10%的行。这解决了使我的音频计数听起来是线性的问题,尽管这样做所需的频率不是线性的。
查表。
不优雅,但很有效。
发布于 2015-08-31 23:30:20
您需要使用对数间距:
// 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。这是由于浮点精度和舍入误差。
https://stackoverflow.com/questions/32320028
复制相似问题