numpy - 过滤wav文件时出现值错误

标签 numpy scipy wav pyaudio

我们目前正在集成三个代码 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)

最佳答案

您的文件有两个 channel ,因此 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()默认创建一个 float 组。如果你想要y具有与 x 相同的数据类型,你可以这样做

y = np.zeros_like(x)

您还可以显式设置数据类型,因此如果您想要 y为 32 位 float :

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 上创建一个关于它的新问题。 :)

关于numpy - 过滤wav文件时出现值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49607395/

相关文章:

python - 使用 np.matrix 数组的矩阵乘法和使用 np.arrays 的 dot()/tensor() 有什么区别?

c# - 最近邻分类算法的 NumPy 实现以完全相同的方式对所有内容进行分类

ruby - 用于从频率生成WAV文件的Ruby API?

audio - iPhone上wav文件标题中的Subchunk2ID

python - 无法将稀疏矩阵写入 csv

python - 为什么 numpy.double 适用于嵌套列表而 numpy.complex 不适用?

python - 使用 3d 数据和参数在 Scipy 中进行曲线拟合

numpy - 在 scipy 中对不均匀间隔的向量进行卷积

python - 求三次函数的根