小编no.*_*ing的帖子

用Python实现实时信号处理 - 如何连续捕获音频?

我打算用Python实现一个"类DSP"信号处理器.它应该通过ALSA捕获音频的小片段,处理它们,然后通过ALSA播放它们.

为了开始,我编写了以下(非常简单的)代码.

import alsaaudio

inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL)
inp.setchannels(1)
inp.setrate(96000)
inp.setformat(alsaaudio.PCM_FORMAT_U32_LE)
inp.setperiodsize(1920)

outp = alsaaudio.PCM(alsaaudio.PCM_PLAYBACK, alsaaudio.PCM_NORMAL)
outp.setchannels(1)
outp.setrate(96000)
outp.setformat(alsaaudio.PCM_FORMAT_U32_LE)
outp.setperiodsize(1920)

while True:
    l, data = inp.read()
    # TODO: Perform some processing.
    outp.write(data)
Run Code Online (Sandbox Code Playgroud)

问题是,音频"口吃"并且不是无间隙的.我尝试使用PCM模式,将其设置为PCM_ASYNC或PCM_NONBLOCK,但问题仍然存在.我认为问题是两个后续调用"inp.read()"之间的样本"丢失".

有没有办法在Python中"连续"捕获音频(最好不需要太"特定"/"非标准"的库)?我希望信号总是"在后台"被捕获到一些缓冲区中,我可以从中读取一些"瞬间状态",同时即使在我执行读取操作的时间内,音频也会被捕获到缓冲区中.我怎样才能做到这一点?

即使我使用专用的进程/线程来捕获音频,这个进程/线程总是至少必须(1)从源读取音频,(2)然后将其放入某个缓冲区(从中"信号处理")进程/线程然后读取).因此,这两个操作仍将按时间顺序进行,因此样本将丢失.我该如何避免这种情况?

非常感谢您的建议!

编辑2:现在我开始运行了.

import alsaaudio
from multiprocessing import Process, Queue
import numpy as np
import struct

"""
A class implementing buffered audio I/O.
"""
class Audio:

    """
    Initialize the audio buffer.
    """
    def __init__(self):
        #self.__rate = 96000
        self.__rate = 8000
        self.__stride = 4
        self.__pre_post = …
Run Code Online (Sandbox Code Playgroud)

python audio multithreading signal-processing alsa

8
推荐指数
1
解决办法
2292
查看次数

及时编译总是更快?

在 Stack Overflow 上向所有编译器设计者致以问候。

我目前正在从事一个项目,该项目的重点是开发一种用于高性能计算的新脚本语言。源代码首先被编译成字节码表示。字节码然后由运行时加载,它对其执行积极的(可能是耗时的)优化(这比大多数“提前”编译器所做的更进一步,毕竟这是整个过程中的重点。项目)。请记住,此过程的结果仍然是字节码。

然后字节码在虚拟机上运行。目前,这个虚拟机是使用直接跳转表和消息泵来实现的。虚拟机通过指针运行字节码,在指针下加载指令,在跳转表中查找指令处理程序并跳转到其中。指令处理程序执行适当的操作,并最终将控制权返回给消息循环。虚拟机的指令指针递增,整个过程重新开始。我能够用这种方法实现的性能实际上非常惊人。当然,实际指令处理程序的代码又是手动微调的。

现在大多数“专业”运行时环境(如 Java、.NET 等)都使用即时编译在执行前将字节码转换为本机代码。使用 JIT 的 VM 通常比字节码解释器具有更好的性能。现在的问题是,由于解释器所做的基本上就是加载一条指令并在跳转表中查找跳转目标(记住指令处理程序本身是静态编译到解释器中的,所以它已经是本机代码),是否会使用即时编译会提高性能还是会降低性能?我真的不能想象解释的跳转表降低性能大大弥补了使用 JITer 编译该代码所花费的时间。我知道 JITer 可以对代码执行额外的优化,但在我的情况下,在执行之前已经在字节码级别执行了非常积极的优化。你认为我可以通过用 JIT 编译器替换解释器来获得更快的速度吗?如果是这样,为什么?

我知道同时实施方法和基准测试将为这个问题提供最准确的答案,但如果有明确的答案,可能不值得花时间。

谢谢。

compiler-construction jit software-design runtime-environment

6
推荐指数
1
解决办法
1445
查看次数

如何从 Python HTTP 服务器调用函数?

我想为我的一个应用程序提供一个 Web 界面。为了实现这一点,我BaseHTTPRequestHandlerBaseHTTPServer包中进行子类化(到我调用的类中_RequestHandler)并实现我自己的 HTTPHEAD / GET / POST / PUT请求处理程序。

当我收到对“普通文件”的请求时,我只需打开它,从文件系统中读取它并将其提供给浏览器。效果很好。但是,作为一个 Web 界面,我还想将某些请求传达给应用程序后端。为此,我希望我的服务器提供一个接口,通过该接口可以注册某些 URL 的回调函数(由后端),当有注册 URL 的请求传入并传递请求头和正文时,将调用该回调函数到为该 URL 注册的请求处理程序(= 回调函数)。

IE。我希望能够做这样的事情。

def callback_function(request):
   # Do some processing.
   return response

srv = WebServer(port = 8080, webroot = "htdocs/")
srv.register("/cgi-bin/test", callback_function)
srv.run()
Run Code Online (Sandbox Code Playgroud)

现在,当有人使用浏览器请求某个尚未注册的任意 URL 时,Web 服务器将加载指定的文件(相对于“Web 根目录”)并传送它。

我原则上知道如何实现这一点。将应以不同方式处理的 URL 放入字典中。对于每个请求,检查请求的 URL 是否在字典中。如果是,则将请求数据(HTTP header 和 body)放入“请求对象”中,调用为该 URL 注册的回调函数并将该请求对象传递给它。从回调函数获取响应对象,提取其内容(HTTP 标头和正文)并将其提供给客户端。如果 URL 不在“特殊处理”字典中,则只需从文件系统(相对于“Web 根”)加载文件并提供服务。

问题是,为了运行网络服务器,我必须做这样的事情。

server = HTTPServer(("localhost", port), _RequestHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法将对象(实例)传递_RequestHandler构造函数 …

python simplehttpserver basehttprequesthandler

6
推荐指数
0
解决办法
3310
查看次数