我试图建立一个图形频谱分析仪素。

目前我正在读1024bytes的16位的双信道为44 100赫兹样率的音频流和平均幅度的2频道在一起。所以现在我有一系列256签署的短裤。我现在要预制件一fft上阵列,使用一个模块顽固,并使用的结果创建的图谱分析仪,开始将只是32条。

我已经阅读了维基百科上的文章快速傅里叶变换和离散傅里叶变换,但我仍然不清楚为什么得到的阵代表。这是什么阵看起来像之后,我预制件fft在我的阵列,使用顽固:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

我想知道究竟什么这些数字代表和我怎么会把这些数字进入的百分比高于每32条。此外,我应该平均2频道在一起吗?

有帮助吗?

解决方案

阵列显示的是傅立叶变换系数的音频信号。这些系数可以被用来获得的频率,内容的声音。FFT被定义为复杂的价值的输入功能,使该系数的你得到了将虚构的数字即使你输入所有真正的价值。为了得到金额的权力在每个频率上,你需要计算幅度的FFT系数为每个频率。这个是 只是真正的组成部分的系数,需要计算的平方根总和广场的现实和虚构的组成。也就是说,如果你的系数是a+b*j,然后其规模是sqrt(a^2+b^2).

一旦你有了计算幅度的每一FFT系数,需要找出这声音频率的各FFT系数。N点FFT会给你的频内容的信号,在N同样间隔的频率,从0.因为你的取样频率44100样品/秒。和点的数量在你FFT为256,你的频率间隔是44100/256=172赫兹(大约)

第一个系数,在你的阵将是0频率系数。这基本上是平均功率水平的所有频率。其余的你的系数将数从0的倍数172赫直到你得到128。在FFT,你只可以量度的频率最多一半的采样点。阅读这些链接 奎斯特频率奎斯特-Shannon样定理 如果你是个贪吃的惩罚,并且需要知道为什么,但基本结果是,你的频率较低,都会被复制或 锯齿 在更高的频率桶。这样的频率将开始从0增加172赫兹的每个系数,以N/系数2,再减少172赫兹至N-1系数。

这应该是足够的信息让你开始。如果你想一个更加平易近人介绍Fft于是鉴于在维基百科,你可以试试 了解数字信号处理:2nd Ed..这是非常有帮助我。

所以这是什么这些数字表示。转换到一个百分比的高度可以通过扩展的每个频率分量值的总和的所有组成的星等。虽然,这只会给你一个表示的相对频率分布,并不实际的权力的每个频率。你可以尝试通过扩展的最大幅度的可能频率组成部分,但我不知道,这将显示非常好。最快的方式找到一个可行的伸缩因素将是实验上响亮而柔的音频信号找到合适的设置。

最后,你应该平均值的两个渠道一起,如果你想要展示的频内容的整个音频信号作为一个整体。你是混合体声音入单声道的音频和显示出的合并的频率。如果你想要两个单独显示左右的频率,然后你会需要执行的傅里叶变换在每个频道分开。

其他提示

虽然这个帖子已有数年之久,但我发现它非常有用。我只想向发现这一点并试图创造类似内容的任何人提供我的意见。

至于分为条形,这不应该像antti所建议的那样,通过根据条形数均等地划分数据。最有用的是将数据分成八度音阶,每个八度音程是前一个频率的两倍。 (即100hz是高于50hz的一个八度音阶,高于25hz的一个八度)。

根据您想要的条数,将整个范围划分为1 / X倍频程范围。 根据条形图上给定的中心频率A,您可以从以下位置获得条形图的上限和下限:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

要计算下一个相邻的中心频率,请使用类似的计算:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

然后平均适合这些范围的数据以获得每个条形的振幅。

例如: 我们想要分成1/3倍频程范围,我们从1khz的中心频率开始。

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

鉴于44100hz和1024个样本(每个数据点之间为43hz),我们应该将值从21到26平均。(890.9 / 43 = 20.72~21和1122.5 / 43 = 26.10~26)

(1/3倍频程可以让你在~40hz到~20khz之间约30巴)。 正如你现在可以弄清楚的那样,随着我们走得更高,我们将平均更大的数字范围。低条通常仅包括1个或少量数据点。而较高的条形可以是数百个点的平均值。原因是86hz是一个高于43hz的八度音阶......而10086hz听起来几乎与10043hz相同。

您所拥有的是一个样本,其时间长度为256/44100 = 0.00580499秒。这意味着您的频率分辨率为1 / 0.00580499 = 172 Hz。从Python中获得的256个值对应于频率,基本上从86 Hz到255 * 172 + 86 Hz = 43946 Hz。你得到的数字是复数(因此每隔一个数字末尾的“j”)。

已编辑:错误信息

您需要通过计算sqrt(i 2 + j 2 )将复数转换为幅度,其中i和j是实部和虚部。

如果你想要32个小节,你应该根据我的理解取四个连续振幅的平均值,得到256/4 = 32个小节你想要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top