Actionscript 3 理解soundMixer.computeSpectrum

Actionscript 3 理解soundMixer.computeSpectrum,actionscript-3,math,audio,Actionscript 3,Math,Audio,我可以在互联网上找到的所有示例都只是可视化函数computeSpectrum的结果数组,但我的任务是做其他事情 我生成一个音符,我需要通过分析结果数组来说出正在播放的音符。我发现我需要将函数调用'FFTMode'的第二个参数设置为true,然后它返回声音频率。我认为它应该只返回一个非零值,我可以用它来确定我使用Math.sin函数生成的注释,但事实并非如此 有人能给我一个完成任务的方法吗?使用soundMixer.computeSpectrum是一项要求,因为我稍后将分析更复杂的声音。FFT将把

我可以在互联网上找到的所有示例都只是可视化函数
computeSpectrum
的结果数组,但我的任务是做其他事情

我生成一个音符,我需要通过分析结果数组来说出正在播放的音符。我发现我需要将函数调用'FFTMode'的第二个参数设置为true,然后它返回声音频率。我认为它应该只返回一个非零值,我可以用它来确定我使用Math.sin函数生成的注释,但事实并非如此


有人能给我一个完成任务的方法吗?使用soundMixer.computeSpectrum是一项要求,因为我稍后将分析更复杂的声音。

FFT将把信号窗口转换为一组Nyquist正弦波,因此除非
440Hz
是其中之一,否则您将获得不止一个非零值!对于单个正弦波,由于混叠,您将获得2个频率。这里有一个例子:

正如您可以看到的,对于精确的奈奎斯特频率,FFT响应是单峰的,但对于附近的频率,有更多的峰值

由于信号的形状,您可以获得具有峰值的连续频谱,而不是离散值

i-th
样本的频率是
f(i)=i*samplerate/N
,其中
i={0,1,2,3,4,…(N/2)-1}
是样本索引(第一个是DC偏移,所以不是
0
的频率),而
N
是传递给FFT的样本计数


因此,如果您想检测一些谐波(单个基频的倍数),则设置
采样器
N
So
samplerate/N
是它的基频或分频器。这样一来,谐波正弦波只会得到一个峰值。简化计算。

FFT会将信号窗口转换为一组奈奎斯特正弦波,因此除非
440Hz
是其中之一,否则您将获得不止一个非零值!对于单个正弦波,由于混叠,您将获得2个频率。这里有一个例子:

正如您可以看到的,对于精确的奈奎斯特频率,FFT响应是单峰的,但对于附近的频率,有更多的峰值

由于信号的形状,您可以获得具有峰值的连续频谱,而不是离散值

i-th
样本的频率是
f(i)=i*samplerate/N
,其中
i={0,1,2,3,4,…(N/2)-1}
是样本索引(第一个是DC偏移,所以不是
0
的频率),而
N
是传递给FFT的样本计数



因此,如果您想检测一些谐波(单个基频的倍数),则设置
采样器
N
So
samplerate/N
是它的基频或分频器。这样一来,谐波正弦波只会得到一个峰值。简化计算。

您能告诉我们到目前为止您尝试了什么吗?是的,当然可以,但没有bug。我复制了生成注释的代码和用于可视化文档中声音的代码。不幸的是,没有用于分析数据的代码,也没有任何关于如何做的解释,或者。。。也许我错过了什么。因此,问题更多的是理论性的,而不是bug。抱歉,这里的代码太长,无法提供,但是您可以在文档中找到它。同样,我想使用computeSpectrum函数的结果来计算一个主频,对应于440hz连续音调的生成声音,从FFT结果中可以得到什么数字?你需要取这个
-1到1
范围,做一些数学运算(例如:根据采样率等进行计算),以得到440…VC.One的结果。你是什么意思?我到底需要编写什么样的数学程序?你能告诉我们到目前为止你都尝试了什么吗?是的,我当然可以,但没有bug。我复制了生成注释的代码和用于可视化文档中声音的代码。不幸的是,没有用于分析数据的代码,也没有任何关于如何做的解释,或者。。。也许我错过了什么。因此,问题更多的是理论性的,而不是bug。抱歉,这里的代码太长,无法提供,但是您可以在文档中找到它。同样,我想使用computeSpectrum函数的结果来计算一个主频,对应于440hz连续音调的生成声音,从FFT结果中可以得到什么数字?你需要取这个
-1到1
范围,做一些数学运算(例如:根据采样率等进行计算),以得到440…VC.One的结果。你是什么意思?我需要编程的确切数学是什么?我需要从FFT数组中提取最大值及其索引吗?它将是f(I)并计算samplerate,即f(I)/I*N?@Graizik
samplerate
是声音采样的频率(在声卡上或任何东西上)所以通常11025或44100或48000或192000 Hz,我不知道您是否可以在您的平台上更改,
N
是可调整的,但FFT仅使用2的幂次(因此1,2,4,8,16,32,…)。因此,您需要找到尽可能接近基本频率的组合
samplerate/N
。然后找到FFT结果中的最大峰值,这应该很好。如果出现混叠(你知道你只有一个音调,但有两个峰值,那么音调频率介于两者之间)@Graizik你的值是多少<代码>采样器,N,音调频率,峰值
i
(从0开始计数)?我写了一个独立于声卡属性的程序。我按照AS3文档t.writeFloat(Math.sin((Number(c+p)/Math.PI/2))*0.25中的建议生成声音;p是一个位置,c是从0到8096的索引。我把2改成了某个数字(我需要弄清楚到底是什么)