【问题标题】:How to record to .wav from microphone after applying fast fourier transform and a high pass filter on it?应用快速傅立叶变换和高通滤波器后如何从麦克风录制到 .wav?
【发布时间】:2009-10-28 22:48:20
【问题描述】:

我从麦克风接收输入,然后在其上应用 fft。 之后,我将高于 1KHz 的频率设为零(高通滤波器)。

我想知道在将麦克风输入传递给 fft 并应用高通滤波器之后如何记录麦克风的输入。

我正在使用 c#,我需要做什么? :P

【问题讨论】:

    标签: c# filter wav record fft


    【解决方案1】:

    在您的 FFT 和过滤之后,您需要执行逆 FFT 以将数据返回到时域。然后,您想将该组样本添加到您的 .WAV 文件中。

    就生成文件本身而言,该格式已广泛记录在案(谷歌搜索“.WAV 格式”应该会得到比你有用的更多的结果),而且非常简单。它基本上是一个简单的标题(称为“块”),表示它是一个 .WAV 文件(或实际上是一个“RIFF”文件)。然后是一个“fmt”块,它告诉样本的格式(每个样本的位数、每秒样本数、通道数等)。然后是一个包含样本本身的“数据”块。

    由于听起来您将要实时执行此操作,因此我的建议是忘记执行 FFT、滤波器和 iFFT。 FIR 滤波器将给出基本相同的结果,但通常要快得多。 FIR 滤波器的基本思想是,不是将数据转换为频域,对其进行滤波,然后再转换回时域,而是将滤波器系数转换为时域,并将它们(公平地)直接应用于输入数据。这就是 DSP 的优势所在:几乎所有 DSP 都具有乘法累加指令,可以在一条指令中实现大部分 FIR 滤波器。然而,即使没有这个,让 FIR 滤波器在现代处理器上实时运行也不需要任何真正的技巧,除非您正在执行真正快速采样。无论如何,让 FFT/滤波器/iFFT 以相同的速度运行要容易得多。

    【讨论】:

    • @Jerry Coffin - 我不得不对 FIR 与 FFT/multiply/IFFT 的速度持不同意见。对于 64 抽头 FIR 滤波器,每个输出样本需要 64 次乘法累加。通过使用 N=128 变换和重叠保存处理 (en.wikipedia.org/wiki/Overlap-save_method) 的 FFT,您可以进行变换、复数缓冲区乘法和逆变换 = 2*128*log2(128) + 6*128 = 2560 次操作,即将为 40 个操作/样本计数计算 64 个样本,为您节省 24 个周期。这里有一些内存访问等问题,但随着过滤器变长,FFT 方法会大放异彩。
    • 在某些时候 FFT 会更好,这是真的 - IME,虽然这在实践中非常罕见。特别是,FIR 对缓存非常友好(通过数据和系数进行线性读取)。相比之下,FFT 实际上定义了“缓存敌对”。在现代处理器上,几乎可以保证单个高速缓存未命中至少 50 个周期。在现代处理器上,您通常可以将 CPU 周期视为空闲;限制因素是内存带宽。
    • 我将此处的示例:ccrma.stanford.edu/courses/422/projects/WaveFormat 放入 .txt 中,然后将扩展名更改为 .wav 并不起作用。它不应该像这样工作吗?
    • 看了一眼,它以十六进制显示字节——您是否将它们输入为十六进制文本?如果是这样,它不应该工作。相反,这些应该作为单个字节的二进制值输入。看起来他们展示的样本也不完整——它显示了标题和前几个样本,但它的标题说它会有比那里显示的更多的样本。
    • 执行 iFFT 后,您应该准备好将数据写入文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多