幸运的是,你似乎比错误更具有优势。
导致额外红线的首要问题是由于在中如何解码数据。由于样本跨越4个字节,所以您必须按4的倍数进行索引(例如,对于样本0,字节0,1,2,3,对于样本1,字节4,5,6,7),否则您将读取重叠的4个字节块(例如,样本0的字节0,1,2,3,样本1的字节1,2,3,4)。此转换的另一件事是,在将无符号字节分配给和(它们的类型为)之前,必须将结果明确地转换为带符号的类型,以便从无符号字节获得带符号的16位结果。这应该给您一个转换循环,看起来像:
到这个阶段,您应该开始获得一个具有强烈线条的图形,代表着您的20Hz-20kHz啁啾声:
但您应该注意到实际上会得到两条线。这是因为对于实数信号,频率谱具有共轭对称性。频谱在奈奎斯特频率(一半采样率,本例中为44100Hz/2)以上的幅度是谱以下奈奎斯特频率的冗余反映。只绘制奈奎斯特频率以下的非冗余部分可以通过将中的 的定义更改为以下内容来实现:
并会给你:
这几乎是我们要找的,但随着频率的增加进行扫描会生成一条逐渐下降的线。这是因为你的索引使得0Hz频率在索引0处,也就是图像的顶部,而22050Hz频率在索引处,也就是图像的底部。为了将图像翻转并获得更常见的0Hz在底部,22050Hz在顶部,你可以改变索引使用:
现在你应该有一个看起来像你预期的图形(尽管使用了不同的颜色映射):
最后提醒一点:虽然我理解您避免在转换为分贝时取对数0的意图,但在这种情况下将输出设置为线性幅度可能会产生意外的结果。相反,我建议选择一个保护的截止阈值幅度:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/7019.html