gpt4 book ai didi

python - 从 Raspberry Pi 上的麦克风读取频率

转载 作者:行者123 更新时间:2023-11-28 20:40:13 27 4
gpt4 key购买 nike

有没有一种简单的方法可以记录几秒钟的声音并将其转换为频率?我有一个 USB 麦克风和一个树莓派 2 B。

在发布的文件 (convert2note.py) 中,我想知道如何使 f 等于从麦克风获得的频率。 This is what the program looks like so far

#d=69+12*log(2)*(f/440)
#d is midi, f is frequency
import math
f=raw_input("Type the frequency to be converted to midi: ")
d=69+(12*math.log(float(f)/440))/(math.log(2))
d=round(int(d))
notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
print notes[d % len(notes)]

提前致谢:D

最佳答案

要捕获音频,例如,您可以使用 sox程序。有关详细信息,请参阅链接的文档,但它可以像这样简单:

rec input.wav

但是下面是用来让文件匹配下面代码期望的格式;

rec −c 2 −b 16 −e signed-integer -r 44100 input.wav

(从技术上讲,只有 -c-b-e 选项才能匹配下面的代码。您可以减少示例rate -r 以加快处理速度)

对于用 Python 处理音频,最好将其保存在 wav 文件中,因为 Python 有一个模块可以读取标准库中的音频。

为了将音频转换为频率,我们将使用 discrete Fourier transform以 Numpy 的形式 fast Fourier transform for real input .请参阅下面的代码片段,其中我还使用 matplotlib 来绘制图表。

下面的代码假定一个 2 声道(立体声)16 位 WAV 文件。

from __future__ import print_function, division
import wave
import numpy as np
import matplotlib.pyplot as plt

wr = wave.open('input.wav', 'r')
sz = wr.getframerate()
q = 5 # time window to analyze in seconds
c = 12 # number of time windows to process
sf = 1.5 # signal scale factor

for num in range(c):
print('Processing from {} to {} s'.format(num*q, (num+1)*q))
avgf = np.zeros(int(sz/2+1))
snd = np.array([])
# The sound signal for q seconds is concatenated. The fft over that
# period is averaged to average out noise.
for j in range(q):
da = np.fromstring(wr.readframes(sz), dtype=np.int16)
left, right = da[0::2]*sf, da[1::2]*sf
lf, rf = abs(np.fft.rfft(left)), abs(np.fft.rfft(right))
snd = np.concatenate((snd, (left+right)/2))
avgf += (lf+rf)/2
avgf /= q
# Plot both the signal and frequencies.
plt.figure(1)
a = plt.subplot(211) # signal
r = 2**16/2
a.set_ylim([-r, r])
a.set_xlabel('time [s]')
a.set_ylabel('signal [-]')
x = np.arange(44100*q)/44100
plt.plot(x, snd)
b = plt.subplot(212) # frequencies
b.set_xscale('log')
b.set_xlabel('frequency [Hz]')
b.set_ylabel('|amplitude|')
plt.plot(abs(avgf))
plt.savefig('simple{:02d}.png'.format(num))
plt.clf()

avgf 数组现在保存左右频率的平均值。情节看起来像这样;

sample graph

如您所见,声音信号通常包含许多频率。

关于python - 从 Raspberry Pi 上的麦克风读取频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250228/

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