无法运行lFilter(rpi2b)

时间:2016-09-04 09:43:34

标签: python numpy scipy raspberry-pi2

一些信息:我正在使用带有卷云逻辑音频卡的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)

我跳过了流开放部分和解码和编码,因为最后的那些现在与线程完全相同,第一个工作就是为什么我只是发布了这些部分。如果需要,我也可以提供其他人。

非常感谢任何帮助!

  • Sanj3k

这是一个数据看起来像的例子,起初它是一个1d的np数组,并且因为立体声而在重塑等等2d之后....

lFilter需要什么?因为我有轴错误,2d它有小......

screenshot from the terminal

编辑:顺便说一下这里是来自scipy库的lfilter函数文档,它说:

x : array_like
An N-dimensional input array.

http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html

1 个答案:

答案 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)的零数组。