【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现

利用傅里叶变换求得音频数据的频率,根据音高频率对照表,可测试出吉他每根弦与标准音的差值,实现调音器效果。

目录

  • 程序效果
  • 实现过程
  • 样例代码
  • 测试用例
  • 参考资料

程序效果

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现_第1张图片

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现_第2张图片

截图1:程序效果

        输入需要调整的弦,即开始录音,弹对应的弦即可,录音时间大约10秒,10秒后短暂计算处理后会显示结果。

实现过程

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现_第3张图片

截图2:流程图

主要步骤如上,需要注意的细节有: 

 1.如何获取有效的4096个采样数据点

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现_第4张图片

截图3:有效数据前的杂音及静音数据

        本程序强行跳过前8000个采样数据点,并且用600进行边界判定,从第一个大于600的点开始采集。这要求使用的环境很安静才行,如果有其他声音干扰,对结果有较大影响。

2.6弦的特殊情况 :1-5弦使用正常时,6弦的频率值一直为正常值的2倍,无法定位问题情况下,强行将结果除以2,保证功能可以正常使用。

样例代码

1.下载链接:https://download.csdn.net/download/u013025955/11190369

部分主要代码

//傅里叶变换
void getFFTEnergy(double *data)
{
    double pr[DATASIZE], pi[DATASIZE], fr[DATASIZE], fi[DATASIZE];
    int i=0;

    //原始数据作为实部,虚部填0.0
    for (i=0; i max)
        {
            max = *(data+i);
            locate = i;
        }
    }

    //计算频率,频率=横坐标*(采样率/采样点数)
    frequence = locate*(8000.0/DATASIZE); 

    //6弦的特殊处理,除以2
    if (chooseStr == 6)
    {
        frequence = frequence/2.0;
    }

    return frequence;
}

测试用例

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现_第5张图片

截图4:测试用例

参考资料

1.《常用算法程序集(C语言描述)》FFT快速离散傅里叶变换例程

2.深入浅出解释FFT(一)——用fft求频谱

https://blog.csdn.net/wordwarwordwar/article/details/68951388

3.fseek()用法 设定文件的当前读写位置

https://blog.csdn.net/Tian_fourpieces/article/details/79970098

你可能感兴趣的:(C/C++,私有田)