请高手支招,如何应用c语言和win32api读写wav、mp3文件的音调(频率)?注意不是采样频率。

解决方案 »

  1.   

    wav文件可以直接FFT转到频域获得音调(频率),mp3则要解码到wav格式才能处理
      

  2.   

    关于FFT的原理请看《数字信号处理》,关于代码,网上有许多。也有一些库提供了fft函数可以用。
      

  3.   

    谢谢楼上各位的回答,请问还有其他的方法吗?我在做毕设,内容是做一个模拟多普勒效应的软件,难点就是读取音频文件(主要是wav、MP3)音调。现在情况比较紧急,希望各位高手能给点指导,谢谢了!
      

  4.   

    你什么专业
    知道美国国家仪器么?
    NI公司的LabWindows的函数库里有专业的信号分析工具
    包括FFT、卷积、希尔伯特变换能
    你可以考虑一下
    至于读wav
    这个网上很多例子吧
      

  5.   

    我的专业是物理,你说的LabWindows的库函数C语言可以调用吗?我是要通过编程画出wav文件的音调线哦,并对它的音调进行定量的修改,然后再按修改后的音调播放出这个文件,并画出修改后的音调线。
      

  6.   

    可以参考我的这个代码,里面有wav文件的读取与画频谱线。
    mp3转wav用Dshow要方便些,另外也有开源库。
      

  7.   

    地址忘写了
    http://download.csdn.net/source/800786
      

  8.   

    我下载了那个代码,好像用的是C++ + MFC吧,对不起,我对那个不熟悉,代码看不懂哦,能说一下基本思想吗?
      

  9.   


    LabWindowsb就是一个基于C的开发平台
    一般学通信的人都应该知道这个软件
    至于你说的功能
    只要能把波形换算到频域上就应该好解决了吧
      

  10.   

    你只需要看下播放文件到画图的过程就行了,另外wave文件我没有解析,直接按44KHz双声道来处理的。下面是其流程图:
      

  11.   


    以我的理解,大致就是从声卡(或文件)中取得数据,放入缓冲区,然后用FFT处理,得到频域,然后画出图是吗?
    这样应该可以解决读取音调的问题,谢谢!现在还有一个问题是改变音调,并以改变后的音调播放文件,请问这个问题怎么办呢?
      

  12.   


    改变后再做一次FFT逆变换然后写回声卡不就行了
      

  13.   

    我建议你还是用DirectShow来弄把!
      

  14.   

    谢谢你的建议,对于怎么操作wav和FFT我已经比较清楚了,我还是用这种方法先试试吧,不行的话到时再看看DerectShow吧.不过对于怎么改变频率,还是没有眉目,有谁知道支支招啊!
      

  15.   

    你是问改变频率的方法还是把频率改成什么值?
    如果是前者,fft后就获得了各个频点的强度值,直接把值改大改小,也就改变了对应频点的强度,然后再FFT逆变换(也就是fft_double函数的参数p_bInverseTransform设为true),得到的数据就可以送声卡播放。
      

  16.   

    我问的就是改变频率的方法.
    我是这样想的FFT后得到的是个复数数组吧,复数的模才是该点的强度值,复数有实部和虚部,那应该改变哪部分呢?如果我想把频率改成原频率的1.5倍(具体倍数由多普勒效应公式决定),我应该怎么改变数值呢?
      

  17.   

    友情支持,三颗心关照,up~up~up~!!
      

  18.   

    这个说法有问题吧,比如采样512个数据,fft变换后,对应到256个频点,每个频点对应多少频率值,由你的采样率决定,比如是44KHz的采样率,每个频点间隔为44000/256=171Hz,据此,你可以算出声音中2KHz频率的强度,由第11和第12个频点的值确定,因而当你把这两个频点的值单独放大,也就把声音中2KHz的强度提高了。声音数据本来就是由不同的频率合成在一起的,每个频率都有强度值,各频率的大小值决定了声音的内容。
    声音中的频率成分跨度应该是从0到无穷大Hz,只是采样率限制了你所能获得的各频率成分的强度,大于采样率二分之一的频率强度是无法正确计算的。
      

  19.   

    上面计算有误,44KHz的采样率,采样512个数据,fft变换后,得到到256个频点,每个频点间隔为(44000/2)/256=85.9375Hz。2KHz频率的强度,由第23和第24个频点的值确定(2000/85.9375=23.27);
    44KHz的采样率只能获得其一半的频率强度。
      

  20.   

    以我的理解,没错,2KHZ这个频率的强度是增大了,可是它的频率还是2KHz啊,如果声音中还有比它更小的频率,那么声音的总体频率可能会变大,问题是现在不知道一个声音中的基本频率有多少个,如果有很多个,又该如果定量的改变每个基本频率的强度,使得总体频率达到一个定量的值?
    可能我没有理解清楚,希望你再提示提示?
    如果能直接交流就更好了,我的QQ是875156226.你放心,我一定会给你应得的分的,不够的话我再加,反正分就是用来问问题的嘛.
      

  21.   

    我使用的是linux系统,这个系统下提取mp3文件的音调和音长信息,应该怎么做?