gpt4 book ai didi

python - 音频频谱分析仪(15 个条中 4410 个值)

转载 作者:行者123 更新时间:2023-12-01 02:53:35 25 4
gpt4 key购买 nike

我想用Python制作音频频谱分析仪。我使用 pyaudio 库,我正在从麦克风读取流。对于每次读取,我都会得到 4410 个值,我使用 numpy 将其转换为数字,然后将它们绘制到 pygame 屏幕上。它看起来像这样:https://photos.google.com/share/AF1QipMCWVk1pR0dmrrsTlpE3gHQ9GTUV25MqwUxw4JuW8TrItkGkuU9X3ZpY2ZQ-RLHew?key=UE9Id19IU1dtSHZfUk43TjB3SWxFcVhRRTFYOWFB (图表是上下颠倒的)我的代码是这样的:

import pyaudio, math, struct,pygame, numpy
pa = pyaudio.PyAudio()
#open audio stream
stream = pa.open(input_device_index=1,rate=44100,format=pyaudio.paInt16,channels=2,input=True)

#read bytes from stream and convert to numbers
def get_data():
data = stream.read(int(44100*0.05))
s = numpy.fromstring(data, numpy.int16)
return struct.unpack('h'*4410, data)



pygame.init()
screen = pygame.display.set_mode((4000,1000))

def redraw():
data = get_data()
#draw every number as a bar onto pygame windows
#last 4410 values are missin
for x in range(4000):
val = data[x]
pygame.draw.rect(screen,(0,0,0),(x,0,1,1000),0)
pygame.draw.rect(screen,(255,255,255),(x,0,1,val),0)


pygame.display.update()
pygame.event.clear()

while 1:
redraw()

有没有什么奇特的方法可以将这 4410 个值合并为 15 个值,这样我就可以在合理大小的窗口中拥有漂亮又酷的绿色和红色条,而不是这个需要 3 个屏幕的丑陋的东西?

最佳答案

频率与时域

正如所写,您的代码绘制了 time-domain样本的表示,而频谱分析仪是 frequency domain表示。

时间<->频域转换可以使用Discrete Fourier Transform来实现。在实践中,您需要应用 Window function转换之前的数据。

DFT 的输出是一系列大小相等的频率仓,每个频率仓包含一个实部和虚部。频谱分析仪通常具有相同感知宽度的频带,也就是说,相同数量的倍频程(或倍频程的分数)。因此,每个频段中的频率仓数量将是前一个频段的两倍。 15 个频段相当于每个频段 2/3 个 Octave 。

图形输出说明

您已经渲染了时域样本,每个样本水平使用一个像素,并将幅度直接映射到 Y 坐标。由于幅度范围为-32767 < x < 32768 ,绝大多数样本将小于或大于显示中提供的范围,即 0 <= x < 4000 - 因此大多数样本将被剪辑为 03999 .

您可以通过缩放样本以适应并将结果偏置 500 来纠正此问题。 ,这样样本值为 0渲染在 Y 坐标 500 处。

关于python - 音频频谱分析仪(15 个条中 4410 个值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44478845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com