1. 其实这个项目难点在于,能不能采集到高质量的钢琴音调。先看一下FFT相关程序。

FFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。由于我们在计算 DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。每运算一个 X(k)需要 4N 次复数乘法及 2N+2(N-1)=2(2N-1)次实数加法。所以整个 DFT 运算总共需要 4N^2 次实数乘法和 N*2(2N-1)=2N(2N-1)次实数加法。如此一来,计算时乘法次数和加法次数都是和 N^2 成正比的,当 N 很大时,运算量是可观的,因而需要改进对 DFT 的算法减少运算速度。根据傅立叶变换的对称性和周期性,我们可以将 DFT 运算中有些项合并。我们先设序列长度为 N=2^L,L 为整数。将 N=2^L 的序列 x(n)(n=0,1,……,N-1),按 N 的奇偶分成两组,也就是说我们将一个 N 点的 DFT 分解成两个 N/2 点的 DFT,他们又重新组合成一个如下式所表达的 N 点 DFT:一般来说,输入被假定为连续的。当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算 FFT。

2. 代码部分

#include "myapp.h"
#include "csedu.h"
#include "scancode.h"
#include <math.h>#define PI 3.1415926
#define SAMPLENUMBER 128void InitForFFT();
void MakeWave();int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER];
float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER];
float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];main()
{int i;InitForFFT();MakeWave();for ( i=0;i<SAMPLENUMBER;i++ ){fWaveR[i]=INPUT[i];fWaveI[i]=0.0f;w[i]=0.0f;}FFT(fWaveR,fWaveI);for ( i=0;i<SAMPLENUMBER;i++ ){DATA[i]=w[i];}while ( 1 );    // break point
}void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER])
{int x0,x1,x2,x3,x4,x5,x6,xx;int i,j,k,b,p,L;float TR,TI,temp;/********** following code invert sequence ************/for ( i=0;i<SAMPLENUMBER;i++ ){x0=x1=x2=x3=x4=x5=x6=0;x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;dataI[xx]=dataR[i];}for ( i=0;i<SAMPLENUMBER;i++ ){dataR[i]=dataI[i]; dataI[i]=0; }/************** following code FFT *******************/for ( L=1;L<=7;L++ ){ /* for(1) */b=1; i=L-1;while ( i>0 ) {b=b*2; i--;} /* b= 2^(L-1) */for ( j=0;j<=b-1;j++ ) /* for (2) */{p=1; i=7-L;while ( i>0 ) /* p=pow(2,7-L)*j; */{p=p*2; i--;}p=p*j;for ( k=j;k<128;k=k+2*b ) /* for (3) */{TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];} /* END for (3) */} /* END for (2) */} /* END for (1) */for ( i=0;i<SAMPLENUMBER/2;i++ ){ w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);}
} /* END FFT */void InitForFFT()
{int i;for ( i=0;i<SAMPLENUMBER;i++ ){sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);}
}void MakeWave()
{int i;for ( i=0;i<SAMPLENUMBER;i++ ){INPUT[i]=sin(PI*2*i/SAMPLENUMBER*3)*1024;}
}

3. 启动调试,打开Tools->Graph,分别创建两个Singal Time(一个是原始的正选波形,一个是程序FFT得出的波形)和一个FFT Magnitude(CCS软件用FFT得出的波形),然后对比程序得出的和CCS帮得出的是否一致,就可以检查程序有没有问题。

设置如下:

4. 最终得出的波形图,可以看出程序是正确的。

转载于:https://www.cnblogs.com/429512065qhq/p/9534709.html

DSP5509项目之用FFT识别钢琴音调(1)相关推荐

  1. DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换

    1. 首先电脑上下载一个音频模拟的软件 2. 研究下钢琴的声音范围27HZ到4000HZ,那么采样频率需要是信号的两倍频率以上,所以建议采样频率是16KHZ.先看一下采集到的数据,如下是空载时候采集到 ...

  2. 【人工智能项目】MNIST手写体识别实验及分析

    [人工智能项目]MNIST数据集实验报告 这是之前接的小作业,现在分享出来,给大家以学习!!! [人工智能项目]MNIST手写体识别实验及分析 1.实验内容简述 1.1 实验环境 本实验采用的软硬件实 ...

  3. 项目经历 - 卷积网络识别古日文

    学校做的小项目: 卷积网络识别古日文 Kuzushiji-MNIST数据集(此数据集专注于草书日语)下载 古日文中很重要的一个特征并且不同于现代日语的一点就是古日语含有变体假名(Hentaigana) ...

  4. OpenCV实践小项目(一): 信用卡数字识别

    1. 写在前面 今天整理一个OpenCV实践的小项目, 前几天整理了一篇OpenCV处理图像的知识笔记,后面,就通过一些小项目把这些知识运用到实践中去,一个是加深理解,另一个是融会贯通,连成整体,因为 ...

  5. 【人工智能项目】Fashion Mnist识别实验

    [人工智能项目]Fashion Mnist识别实验 本次主要通过四个方法对fashion mnist进行识别实验,主要为词袋模型.hog特征.mlp多层感知器和cnn卷积神经网络.那么话不多说,走起来 ...

  6. 项目总结:人脸识别签到系统

    人脸识别签到系统项目总结 第一部分:项目简介 实验室人脸识别签到系统 第二部分:项目系统架构设计 2.1业务架构 2.2 技术架构 基础设施:主要是GPU,基于CUDA的开发 学习框架:主要是Dlib ...

  7. 项目的开始 —— 第二步识别干系人

    昨天咱们给大家讲到了,项目的开始分为两步.第一步是制定项目章程,第二步就是识别干系人. 那么今天就给大家讲讲第二步:识别干系人. 那么第一个问题:什么是干系人?所谓干系人就是和你项目有关的人. 比如: ...

  8. matlab 识别钢琴基频 演奏音乐

    就是把钢琴曲换个音调再演奏出来.初衷是用来生成matlab的曲谱的,先写这么多吧.识别正确率好像不是很高,推荐用一些单纯的钢琴曲效果好一些,比如张宇桦的. 换歌曲的话,注释后面带有"**** ...

  9. 深度学习项目:男女性别识别【附完整源码】

    性别分类对于人机交互应用和计算机辅助生理或心理分析等商业领域的许多应用至关重要,因为它包含有关男女特征差异的广泛信息. 本次案例收集了接近二十万的男女数据集图片. 文章目录 性别分类简介 使用 Pyt ...

最新文章

  1. 集员法对3D激光雷达和相机的外部校准
  2. struts.xml配置文件中result的语法
  3. linux面试准备2
  4. 如何在Windows7下删除Ubuntu开机引导项
  5. 李宏毅机器学习课程7~~~反向传播
  6. WebAPI和Node
  7. WEB程序调用客户端程序
  8. Mobx入门之四:自定义reactions,when, autorun
  9. c语言程序下三子棋,C语言实现三子棋游戏(初级版)
  10. SQL Server 存储
  11. 2021-10-25双塔模型
  12. 硕思闪客精灵v2021如何用Flash制作动画短片流程分享
  13. csdn如何上传附件
  14. 8年码龄的技术总监,去上市公司面试,结果凉了!
  15. Spring Cloud Netflix Eureka Server 搭建服务注册中心
  16. 微信云开发——日记小程序
  17. GTP(GPRS Tunnelling Protocol)协议http://blog.csdn.net/stephen_yin/article/details/6951237
  18. 【项目】Java学生宿舍管理系统,赠予即将毕业的兄弟!
  19. matlab的app tab,MATLAB 之 App designer 小白学习(四)
  20. 流畅的Python读书笔记-第八章-对象引用、可变性和垃圾回收

热门文章

  1. (CZ深入浅出Java基础)线程笔记
  2. LNMP(nginx php-fpm mysql) 环境部署——mysql
  3. 鼠标拖动div移动js代码
  4. iOS APP提交上架最新流程(转)
  5. Jenkins 部署
  6. 设置Exchange 2010附件大小限制原则
  7. ADO.NET知识学习总结
  8. MongoDB之compact操作详解
  9. python_day2_数据格式
  10. zabbix监控交换机出图断断续续