嗨,它想知道它是否可以在闪存中创建一个“参数”均衡器。 不仅仅是通常的图形效果,还有一种修改通过应用程序的声音输出的工具。任何参考,提示的想法欢迎。 感谢
答案 0 :(得分:6)
这不会非常容易......但这可能是一种方式:
var parameters:Array = [1,1,1,1,0.5]
var sound:Sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, filter);
sound.load(soundURLRequest);
sound.play();
private function filter(event:SampleDataEvent):void
{
var freqDomain:Array = FFT(event.data, parameters.length); // You will need to find a FFT(Fast Fourier Transform) function to generate an array.
for(var i:int = 0; i < freqDomain.length; i++)
{
freqDomain[i] = freqDomain[i] * parameters[i]; // This is where your EQ parameters get applied.
}
var timeDomain:Array = IFFT(freqDomain, event.data.length); // Inverse FFT
for(value:Number in timeDomain)
{
event.data.writeFloat(value);
}
}
一些关于FFT和IFFT功能的FFT通常输出复数值(实数+复数分量),可以将其转换为幅度和相位分量。你真正需要的只是幅度,它有一个公式=(sqrt(real ^ 2 + complex ^ 2))。人耳对相位不敏感(与对相位非常敏感的眼睛相反),因此当您进行逆FFT时,可以插入随机或平坦的相位,差别不大。请注意,就过滤器实现而言,我的方法水平非常低。
这是一个傅里叶变换函数(虽然不是快速,它只是一个卷积(O(n ^ 2))与FFT O(nlogn))仅供参考(错误...它不在我的头顶,所以如果可能的话错误的常数):
// Note that this only returns the magnitude, I am discarding the phase.
function FFT(sample:Array, size):Array
{
var frequencies = new Array(size);
for(int i = 0; i < sample.size; i++)
{
for(int j = 0; i < frequencies.size; j++)
{
var real:Number = sample[i] * Math.cos(Math.PI/2 * i * j);
var complex:Number = sample[i] * Math.sin(Math.PI/2 * i * j);
frequencies[j] += Math.sqrt(real * real + complex * complex);
}
}
return frequencies;
}
答案 1 :(得分:2)
答案 2 :(得分:1)
结帐Andre Michelle's labs page。他在Flash中使用audo做了很多工作......可能是最好的之一。我不确定参数eq是什么,但你应该能够在该页面上找到一些好的信息。
答案 3 :(得分:1)
更新:我找到了3-band equalizer using Flash 10的示例。它使用的不同于提到的CookieOfFortune,但它有效(好吧,确实如此)。使用它,我更新了5个波段的示例并将其转换为在Flex中运行。你可以see the code on GitHub。
如果有人对如何运行数学有任何建议,我会非常乐意听到它。我在声音修改方面真的不太了解。
原帖: 我不确定这会有多大帮助,但这是一个权宜之计,可以在没有FFT等痛苦的情况下获得声音均衡器的效果。
http://www.webdesign.org/web/flash/tutorials/sound-equalizer.5020.html
基本上,您创建了几个版本的声音文件,每个版本都设置为预先设定的均衡器设置。然后,当用户调整低音或高音时,只需调整相应文件的音量。
您可能还会发现extract()函数对声音变量有帮助: http://livedocs.adobe.com/flex/3/langref/flash/media/Sound.html#extract
答案 4 :(得分:0)
可能一组digital filters是你最好的选择。与FFT不同,使用数字滤波器不需要将整个波形保存在存储器中,因为数字滤波器是因果关系,只是看过去和/或将来的几点。此外,如果您可以流式传输声音,您可以即时应用这些声音。简单的过滤器可以很容易地链接在一起,以制作更复杂的过滤器。
有一个free book on digital filters有一些基本理论,但也可以只翻页并提升公式。例如,快速阅读Ch。 19列出了高通,低通和带通递归滤波器的简单公式,这些公式可能会起到作用,但如果你想获得更好的功能,那么本书中还有很多其他的过滤器。