- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近接手了一个项目,我需要对传入的麦克风数据执行实时滑动 FFT 分析。我选择执行此操作的环境是 OpenGL 和 Cinder,并使用 C++。
这是我第一次接触音频编程,我有点困惑。
这就是我试图在我的 OpenGL 应用程序中实现的目标:
所以在每一帧中,都有一部分传入数据。在 for 循环(因此多次通过)中,当前数据的一个窗口将被消耗,并将对其执行 FFT 分析。对于 for 循环的下一次迭代,window 将通过数据等推进“hop-size”,直到到达数据末尾。
现在这个过程必须是连续的。但是正如您在上图中看到的那样,当我当前的应用程序框架结束并且下一帧的数据进来时,我无法从我离开上一帧的地方拾取(因为数据已经消失)。您可以在图中看到它,其中蓝色区域位于两个框架之间。
现在您可能会说,以一种永远不会发生但不可能发生的方式选择窗口大小/跳跃大小,因为这些参数应该在我的项目中留给用户配置。
也非常欢迎针对这种面向 C++11 的处理提出建议!
谢谢!
最佳答案
不确定我是否 100% 理解您的方案,但听起来您可能想要使用循环缓冲区。没有“标准”循环缓冲区,但是 there's one in Boost .
但是,如果您计划使用 2 个线程进行处理,则需要锁。例如,一个线程会等待音频输入,然后获取缓冲区锁,并将音频缓冲区中的内容复制到循环缓冲区中。如果缓冲区中至少有 k
可用,第二个线程将定期获取缓冲区锁并读取下一个 k
元素...
您需要适当调整缓冲区的大小,并确保处理数据的速度始终快于传入速率,以避免循环缓冲区中的损失...
不确定你为什么提到缓冲区是无锁的,这是否是一个要求,我会先尝试带锁的循环缓冲区,因为它在概念上看起来更简单,只有在必要时才使用无锁,因为在这种情况下,数据结构可能会更复杂(但也许“生产者-消费者”无锁队列会起作用)...
HTH.
关于c++ - 实时数据的 STFT/滑动 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391334/
以下是否相同? 读取音频文件,然后将其裁剪为特定的帧长,并在摘录中执行短时傅立叶变换 代码:stft(cropAudio(readAudio(wav))) 读取音频文件,然后对整个音频文件执行短时傅立
我使用scipy.signal.stft来获取音频的stft。没问题,我正在得到结果。但我不明白的是,当使用采样率为fs=44100 Hz的169600个样本的音频来计算stft时,我得到 3 个返回
作为一个简单的实验,我想计算 stft音频文件: sample_rate, samples = wav.read(file) f, t, Zxx = stft(samples, sample_rate
所以这里的想法是:您可以使用短时傅里叶变换 (stft) 从音频文件生成频谱图。然后有些人生成了一种称为“二进制掩码”的东西,以从反向 stft 生成不同的音频(即,去除背景噪声等)。 以下是我的理解
我目前正在使用 matplotlib 计算频谱图。我指定 NFFT=512,但生成的图像高度为 257。然后,我尝试执行 STFT(短时傅里叶变换),它给出了 512 维向量(如预期)。如果我绘制 S
我正在使用 this检测音高的算法 this音频文件。正如您所听到的,这是在吉他上弹奏的 E2 音符,背景中有一点噪音。 我使用 STFT 生成了这个频谱图: 我正在像这样使用上面链接的算法: y,
我正在尝试实现 FFT,我对代码等没问题,但事情的一般顺序让我感到困惑。 我认为这是正确的事情顺序吗? 输入 -> 重叠输入 -> 窗口化 -> FFT -> 相位计算/重叠补偿 -> 输出 我得到的
我通过相关了解了 DFT 的工作原理,并将其用作理解 FFT 结果的基础。如果我有一个以 44.1kHz 采样的离散信号,那么这意味着如果我要获取 1 秒的数据,我将有 44,100 个样本。为了对其
我想对我的数据执行短时傅里叶变换,并为每个段指定特定的样本长度。我想使用信号子模块中的 SciPy 函数 stft。但是,当我通过以下方式创建长度 10e5 的音频数组时: fs = 10e3 # S
我最近接手了一个项目,我需要对传入的麦克风数据执行实时滑动 FFT 分析。我选择执行此操作的环境是 OpenGL 和 Cinder,并使用 C++。 这是我第一次接触音频编程,我有点困惑。 这就是我试
使用时librosa.stft()要计算频谱图,如何取回相关的频率值?我对生成图像不感兴趣,如 librosa.display.specshow ,而是我想要掌握这些值。 y, sr = libros
这是我运行的一段代码: import tensorflow as tf sess = tf.InteractiveSession() filename = 'song.mp3' # 30 second
根据文档,有一个 scipy.signal.stft 但是当尝试访问该函数时,我从标题中收到错误。该函数记录在 here . 此外,scip.signal.istft 也不存在。有什么建议吗? 最佳答
所以,我想知道如何实现 STFT在 Julia 中,可能使用汉明窗。我在互联网上找不到任何东西。 最好的方法是什么?我宁愿不使用 Python 库,但如果可能的话,我宁愿使用纯原生的 Julia。也许
函数 spicy.signal.spectrogram:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.spectr
我正在尝试从声音文件(.wav)中获取特征; 我尝试过 stft 来获取 2D 特征(x 是时间,y 是频率) 我尝试过 pywt,但得到的是一维数组。如果我输入一个 1D (1000,) wav 数
我正在将 Python 代码转换为 MATLAB。 Python 代码,使用以下命令: stft_ch = librosa.core.stft(audio_input[:, ch_cnt], n_ff
更新:我在 librosa 中重新实现了这个来进行比较,结果确实与 tensorflow 的结果有很大不同。 Librosa 给出了我期望的结果(但不是 tensorflow)。 我已将其发布为 is
我正在尝试在没有 gpu 的基于 arm 的设备上为 ASR 运行我的 PyTorch 模型。据我所知,arm 不支持 ATen 使用的 MKL。自然地,当我尝试进行推理时会收到以下错误: Runti
我是一名优秀的程序员,十分优秀!