android - 在fft中应用窗口功能的正确方法

标签 android audio fft windowing

我理解为什么我需要在fft中使用窗口函数,我记录了一个正弦波(16位pcm格式),我想分析正弦波音频记录,我已经将麦克风音频记录为字节数组,进行了转换将其返回到表示正弦波的样本数组,该数组的值是[-1,1]-值除以32768。我是否需要将窗口应用于值[-1,1](除数)的数组或我是否需要将其应用于样本数组而不将其除以32768?我在SO和google上查找了一些答案,找不到关于正确方法的任何解释。

最佳答案

linear-time-invariant的特性之一是,多个线性时不变系统级联的结果是相同的,而与操作的执行顺序无关(至少在理论上,在实践中,过滤器等可以具有小的非-线性度会使结果略有不同(取决于订单)。

从理论上讲,将恒定比例因子应用于所有样本可以看作是线性时间不变系统。对于特定的计算机实现,如果缩放不会引入显着的精度损失(例如,通过将数字缩放为浮点最小的可表示值附近的值),也不会导致精度下降,则缩放也可以视为近似线性时不变的。缩放值超出支持范围。在您的情况下,简单地除以32768极有可能不会引入明显的失真,因此可以认为是(大约)线性时不变系统。

类似地,应用将每个样本乘以不同的窗口值的窗口也可以看作是另一个线性时不变系统。

建立了线性时不变系统的级联之后,可以在应用窗口之前或之后以32768进行缩放。

P.S .:正如Paul在评论中提到的那样,如果您以后要使用浮点值,则可能要先执行从16位字到浮点(无论是否缩放)的转换。试图用定点算术执行缩放可能会证明比必要的更为复杂,并且如果不仔细地做的话,可能会导致精度下降。

关于android - 在fft中应用窗口功能的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330120/

相关文章:

java - 你能在 Kotlin/Java 中强制编译器警告或错误吗?

Android:如何在单选AlertDialog中设置选择?

audio - Dialogflow,从音频中检测意图

java - 如何在Java中同步TargetDataLine和SourceDataLine(同步音频记录和播放)

fft - 如何表示 FFT 的立体声音频数据

android - 运行“应用程序 : No target device found. Android Studio 3.6 预览版”时出错

android - 如何将 CPU 使用率和温度信息获取到 Android 应用程序中?

Android Recyclerview MediaPlayer 上一个Item声音停止,点击新一个后释放

python - Matlab 和 Numpy+Python FFT2 之间的差异?

android - 如何在Android中识别和提取音频特征