我们目前正在整合三个代码 1.麦克风录音机 2.积分器(低通滤波) 3.应用过滤器
我们遇到了这个错误:
fltrd()
[[ 0 0]
[ -1 0]
[ 0 0]
...,
[-65 -60]
[-31 -52]
[-45 -53]]
Traceback (most recent call last):
File "<ipython-input-2-72cbac6fd2ac>", line 1, in <module>
fltrd()
File "C:/Users/vsecadesang/Desktop/5th year/2nd sem/SIGNLAB/PROJECT/etc/project.py", line 57, in fltrd
a2 = integ(x)
File "C:/Users/vsecadesang/Desktop/5th year/2nd sem/SIGNLAB/PROJECT/etc/project.py", line 49, in integ
y[0] = x[0]
ValueError: setting an array element with a sequence.
麦克风录音部分正常工作。唯一的问题是,当我们将麦克风记录的wav文件放入积分器并调用定义的过滤器时,它会产生上面提到的ValueError。我们的预计输出是我们将要放入积分器(低通)滤波器的麦克风录音将产生相同的录音,但噪音更少。有点像有源降噪器。我们不知道出了什么问题,请帮忙。
以下是我们的代码:
import pyaudio
import wave
import matplotlib.pyplot as plt
import numpy as np
import scipy.io.wavfile
import scipy.signal as sp
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "file1.wav"
audio = pyaudio.PyAudio()
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
print ("recording...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print ("finished recording")
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
x = scipy.io.wavfile.read('file1.wav')
n = x[1]
def integ(x):
y = np.zeros(len(x))
for i in range(0, len(x)):
if i == 0:
y[0] = x[0]
else:
w = y[i-1]
y[i] = w + x[i]
return y
def fltrd():
n,x = scipy.io.wavfile.read('file1.wav')
print(x)
a2 = integ(x)
a3 = np.asarray(a2, dtype = np.int16)
scipy.io.wavfile.write('file2.wav',n,a3)
答案 0 :(得分:2)
您的文件有两个频道,因此x
的形状(m, 2)
适用于某个整数m
。在您的函数integ(x)
中,您有y = np.zeros(len(x))
。这会创建一个形状为(m,)
的数组。然后,行y[0] = x[0]
会尝试将x[0]
中的两个值复制到单个值y[0]
中。
要解决此问题,请创建y
以使其与x
具有相同的形状:
y = np.zeros(x.shape)
请注意,np.zeros()
默认情况下会创建一个浮点数组。如果您希望y
具有与x
相同的数据类型,则可以执行
y = np.zeros_like(x)
您还可以显式设置数据类型,因此如果您希望y
为32位浮点数:
y = np.zeros(x.shape, dtype=np.float32)
最后,请注意,您的integ()
函数是x
沿其第一个轴的累积和,因此可以简化为y = x.cumsum(axis=0)
。也就是说,您可以完全删除函数integ
,并替换
a2 = integ(x)
与
a2 = x.cumsum(axis=0)
一个潜在的问题是你可能会在16位总和中溢出。如果发生这种情况并且你不知道如何处理它,那么你总是可以在stackoverflow上创建一个关于它的新问题。 :)