在Python3.5,pyaudio,numpy,matplotlib中可视化窦发生器

时间:2016-11-22 09:37:54

标签: numpy matplotlib python-3.5

我试图想象一个正弦发生器,但得到错误

  

ValueError:x和y必须具有相同的第一维

我认为尺寸是相同的,但显然它们不是。 鼻窦发生器是标准的

import pyaudio
import numpy as np

p = pyaudio.PyAudio()

volume = 0.08     # range [0.0, 1.0]
fs = 192000       # sampling rate, Hz, must be integer
duration = 3.0   # in seconds, may be float
f = 257.0        # sine frequency, Hz, may be float
f2 = 258.0
f3 = 300.0
f4 = 301.0

oma = 2000.0

a = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)
b = (np.sin(2*np.pi*np.arange(fs*duration)*f2/fs)).astype(np.float32)
c = (np.sin(2*np.pi*np.arange(fs*duration)*f3/fs)).astype(np.float32)
d = (np.sin(2*np.pi*np.arange(fs*duration)*f4/fs)).astype(np.float32)

om = (np.sin(2*np.pi*np.arange(fs*duration)*oma/fs)).astype(np.float32)

# generate samples, note conversion to float32 array
samples = om*(a+b+c+d)


# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
                channels=2,
                rate=fs,
                output=True)

# play. May repeat with different volume values (if done interactively) 
stream.write(volume*samples)

stream.stop_stream()
stream.close()

p.terminate()

我添加了matplotlib但无法开始工作。我试图在0 - 2 * np.pi的区间内进行可视化,包括单个波和聚合函数。

在线有一个解决方案,但它仅限于两个频率。 Wave interference beat frequency

plt的最新版本是

import matplotlib.pyplot as plt  
x = np.mgrid[0:2*np.pi]

plt.rc('lines', linewidth=4)
plt.plot(samples,x)
plt.show()

1 个答案:

答案 0 :(得分:0)

错误消息暗示传递给x的{​​{1}}和y数组的维度不兼容。您可以使用

进行检查
plt.plot

samples.shape # (576000,) x.shape # (7,) 中有576000个数据点,但samples中只有7个。您很可能希望在x轴上有时间,因此您需要将x定义为

x

然后您可以使用

绘制数据
x = np.arange(fs*duration) / fs

enter image description here

  1. (请注意,x首先出现。)
  2. (您也可以省略x plt.plot(x, samples) ,它只会为您提供x轴上的示例数字。)