- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个应用程序来计算声音信号的 DFT(使用 FFT 算法)。我对 FFT 算法的输入是 PCM 样本 - 即,我有一个很大的 16 位无符号整数列表。
我知道我需要使用窗口函数独立计算多个声音信号片段的 DFT,并且我已经编写了可将输入声音文件解码为原始 PCM 样本的工作代码。
我的问题是关于 definition of the DFT given on Wikipedia :
DFT 应该对输入 x(0), x(1), ..., x(N-1)
执行可逆的线性变换,其中每个 x(n)
是一个复数。但是,我不明白如何将解码后的样本整数转换为适合算法的复数。
我在网上看到一些例子,每个样本被除以一个[0, 1)范围内的浮点值,然后虚部设置为0。
是否有必要缩小到 [0, 1)?并且将每个样本表示为 x + 0i
,其中 x
样本值是否正确?
最佳答案
是的,您可以通过将 0 的虚部添加到每个实数值来创建复数。试试看,它会起作用的。但是,您只是将要处理的数据量增加了一倍,并且创建了大量冗余。您可以注意到输出中的冗余:正频率和负频率的结果系数将相同,除了虚部的符号不同。因此,为了提高效率和减少冗余,通常使用不同的转换将 N
实数值转换为 N/2
复数值,结果您(大致)得到 N/2
个频率。我不会在这里详细介绍,但是可以在这里找到复数 FFT 和实际输入转换的一个很好的实现:http://sourceforge.net/projects/kissfft/
关于你的最后一个问题:不。你不需要缩放你的输入。 DFT 是一种线性变换,因此缩放输入只会导致相同缩放的输出。
编辑: 顺便说一句,您确定这是您想要的复杂 DFT 吗?对于真实数据,特别是 PCM 数据,您应该考虑 Cosine Transform相反,它直接从实际输入数据映射到实际输出。
关于algorithm - 使用 PCM 样本作为 DFT 的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841888/
以下代码适用于某些 wav 文件,但对于其他文件,我得到“InvalidOperationException 未处理。Message=Sound API 仅支持播放 PCM wave 文件。” var
我正在尝试实现 AudioRecord (MIC) -> PCM -> AAC Encoder AAC -> PCM Decode -> AudioTrack?? (SPEAKER) 在 Andro
我想在我的 android 录音应用程序中实现使用 PCM 16 位和 PCM 8 位进行录音的可能性。我在将 byte[] PCM 16 位转换为 8 位时遇到问题,我尝试了不同的方法,但是录音的大
如何将无符号的 8 位 PCM 流 (0-255) 转换为有符号的 8 位 PCM 流 (-128-127)。从每个无符号字节中减去 128 让 0 变成 -128 和 255 变成 127 这么简单
问题与此有关 pydub-Issue .他们告诉我错误信息与 pyaudio 有关。 #!/usr/bin/env python3 import pydub, pydub.playback wav =
我无法在 C++ 中的 16 位缩放 PCM 数据和浮点 PCM 数据之间进行转换。我认为我必须接近,因为输出音频有点类似于我的预期,但它是失真的。 我这样做的原因是因为我在浏览器中运行 ScummV
从this question开始让我了解如何去交错 16 位 PCM 数据的左右声道。 我现在的问题是,如何将 8 位 PCM 解交错并“拉伸(stretch)”为 16 位值 最佳答案 16 位 P
我想添加一些噪音 44100 Hz 2 channel 16 bit interleaved PCM 我正在生成 1 秒的 440Hz 噪声并将其存储在噪声缓冲区中: #define SAMPLING
我是这里的新手。 我想知道任何工具/快速方法来转换具有 3 字节 PCM 样本的 24 位 PCM 原始( headless )文件, 成一个 32 位 PCM 原始文件,每个样本有 4 个字节,4
我已将已签名的单声道 16 位 PCM 音频样本存储在 SInt16 缓冲区中,我正在尝试将它们转换为存储在 UInt8 缓冲区中的未签名的单声道 8 位 PCM 样本。我编写了以下基本工作代码: f
我正在使用 libao 和 libsndfile 来读取和播放音频。我想通过将一个 channel 复制为两个来将单声道流转换为立体声流。此测试代码将正确播放立体声剪辑,但会非常快速和高音播放单声道剪
我正在致力于捕获音频并将其流式传输到 RTMP 服务器。我在 MacOS 下工作(在 Xcode 中),因此为了捕获音频样本缓冲区,我使用 AVFoundation 框架。但对于编码和流媒体,我需要使
我正在尝试从文本到语音接口(interface) (MaryTTS) 获取音频流并将其流式传输到 SIP RTP session 中(使用 Peers)。 同行想要 SoundSource流式传输音频
我已将录制的音频原始 PCM 保存到文件 rxrawpcm.pcm 中,之后我尝试播放 pcm 文件但无法播放录制的 PCM?我没有听到录音,只听到嗡嗡声 配置 AudioRecorder 和 Aud
我有一些原始 PCM 音频文件。我可以成功地从这些文件中读取字节流,并通过接受 PCM 数据作为输入的音频播放机制来播放它们。 当我从这些文件中读取数据时,我将其存储在字节[]中。这些轨道具有相同的大
我正在使用 C++ 进行声波模拟,我从 wav 文件中获取原始 PCM 数据并对其应用一些计算然后我想实时播放它我还想在用户更改一些时重新计算这些数据模拟中的值(如他的位置)。 我尝试了 Portau
我想在 Discord 语音 channel 中录制音频并使用 Discord 机器人将其保存到文件中。 我每 20 毫秒接收一次音频作为 pcm 编码的字节 [],我想将其保存到文件中。MP3 是首
我正在使用 AudioRecord 类来分析麦克风中的原始 pcm 字节。 所以这很好用。现在我需要将 pcm 字节转换为分贝。 我有一个公式可以将 Pa 中的声压转换为 db。 db = 20 *
我使用 oboe在我的 ndk 库中播放声音,我使用 OpenSL with Android extensions将 wav 文件解码为 PCM。解码后的签名 16 位 PCM 存储在内存中 ( st
我可以访问 PCM 音频缓冲区的音频流。我应该清楚我无权访问音频文件。我只能访问 4096 字节的音频数据 block 流。 PCM 缓冲区采用以下格式: PCM 国际 16 小端 两个 channe
我是一名优秀的程序员,十分优秀!