zoukankan      html  css  js  c++  java
  • 关于wav文件fft处理后x,y轴坐标数据的问题

    1.关于横坐标的频率的最大值是采样频率,那么每个点对应的频率值就很好算了:f(n) = [Fs/(N/2)]*n  (Fs是采样频率,常见的是44.1KHz(44100),N是采样点数,k表是第k个点)。我之前也参考了别人的写法,地址 ,有一段内容是这样描述的:

    时域PCM数据是16位的short类型,取值范围是-32768..32767。对于频谱显示用512点FFT就足够了,我们知道音频数据的截止频率是由其采样率决定的,如果采样率为32kHz,截止频率为16kHz。可以计算出FFT后频率间隔为16*1024/(512/2)=64Hz”一开始一直纠结看不懂,不过后来自己仔细想想原来是单位的问题,当然原作者对换算可能也出现问题1024应该是1000吧(kHz和Hz之间的换算是1000);

    2.纵坐标就是处理后的数据,我要做的是频域图,一般的步骤就是读取相应的文件,java中数据的转换确实是个老大难的问题,开始读的时候用的是byte[]数组,而PCM数据对应的是float类型的,而我封装的画图的是double[]数组,所以转啊转,还要确保精确度的问题:

    byte[]转float[]:的写法参考的是上面的链接地址

    floa[]转double[]相对较简单,注意要保证精确度:

    1 //buf字节数组
    2 for (int i = 0; i < buf.length; i++) {
    3             yData[i] = Double.parseDouble(String.valueOf(buf[i]));
    4 }

    对应是FFT算法,网上有很多的分装的类,自己可以自行搜索下载。

  • 相关阅读:
    scala学习之特质(trait)
    Android 使用finalBitmap实现缓存读取
    Android ActionBar以及menu的代码设置样式
    Android获取窗体信息的Util方法
    RelativeLayout用到的一些重要的属性:
    [转] Git SSH Key 生成步骤
    正则表达式
    面向对象
    数组
    顺序结构,循环结构
  • 原文地址:https://www.cnblogs.com/sowhat4999/p/4440158.html
Copyright © 2011-2022 走看看