一些信息:我正在使用带有卷云逻辑音频卡的rpi2b并且已经计算出内核更改以获得声卡,我可以毫无问题地输出,我可以从线路中录制而没有问题(我正在使用pyAudio )。
现在我只想过滤信号,并在scipy库中发现了很多功能......
首先要提到的是我只能使用2声道(立体声)输入声卡似乎不允许1声道而且我没有源流媒体单声道(iPhone,简单的USB播放器每个人都只有立体声).... / p>
过滤器行(规格)只是一个例子我认为如果有效的话它将是另一个过滤器:D
所以在代码开始之前要解释一下。当使用立体声输入时,样本似乎是交错的,所以你在另一个通道上得到另一个样本...我认为这个帖子很有帮助:Convert multi-channel PyAudio into NumPy array
这就是为什么我还尝试将我的流解码为数组,过滤然后再将其编码为流输出。如果我忽略交错的事实,我会得到奇怪的噪音,这就是为什么我认为我应该照顾它:)
现在出现了我失败的部分: lFilter不想工作!如果我只是使用我的未处理的input_data,它表示轴超出范围(我试过-1,0,1,2)不知道:/当使用我的重新塑造等数据时,我得到:
return sigtools._linear_filter(b, a, x, axis, zi)
ValueError: object of too small depth for desired array
有人可以解释为什么会这样吗? :D从来没有使用信号,这就是为什么我没有经验,但我不明白为什么未处理的数据有轴问题,即使它不会打扰因为我需要像链接线程中的重新塑造数据......
WIDTH = 2
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
[b,a] = signal.iirfilter(2,[50,200],rs=60,btype='band',analog=True,ftype='cheby2')
full_data = np.array([])
def callback(in_data, frame_count, time_info, status):
global b,a,full_data
full_data = decode (in_data, 2)
audio_data = signal.lfilter(b,a, full_data)
print (audio_data)
stream_data = encode(audio_data)
return (stream_data, pyaudio.paContinue)
我跳过了流开放部分和解码和编码,因为最后的那些现在与线程完全相同,第一个工作就是为什么我只是发布了这些部分。如果需要,我也可以提供其他人。
非常感谢任何帮助!
这是一个数据看起来像的例子,起初它是一个1d的np数组,并且因为立体声而在重塑等等2d之后....
lFilter需要什么?因为我有轴错误,2d它有小......
编辑:顺便说一下这里是来自scipy库的lfilter函数文档,它说:
x : array_like
An N-dimensional input array.
http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html
答案 0 :(得分:0)
首先,您需要将最终条件保留在一个块中,并将其作为初始条件提供给下一个块。否则,过滤器假定在每个块的开始处休息,这将导致每个块的毛刺。
global zi
audio_data, zi = signal.lfilter(b, a, full_data, zi=zi)`
因此,此调用将更新zi
,然后在下一个周期,它将使用它作为lfilter的输入,这将更新它,等等。正如the docs所说:
zi : array_like, optional
Initial conditions for the filter delays. It is a vector
(or array of vectors for an N-dimensional input) of length
``max(len(a), len(b)) - 1``. If `zi` is None or is not given then
initial rest is assumed.
...
zf : array, optional
If `zi` is None, this is not returned, otherwise, `zf` holds the
final filter delay values.
要首先初始化zi
,只需创建一个形状为(max(len(a), len(b)) - 1, number_of_channels)
的零数组。