基于matlab的吉他调音器APP(提供附件下载)

这篇文章是DSP实验课的期末大作业,我做的内容太简单了,就搬运一下同学,写的比较详细,也有matlab app,附件以积分下载

附件下载地址

1.功能介绍:

本程序的主要功能是吉他调音器,帮助吉他纠正弦的音调。 可以自动识别当前拨动的琴弦,并点亮对应弦位置的指示灯。
当与目标音调差2Hz以内时认为纠正完成,并点亮表盘上的灯。

2.使用介绍:

使用matlab打开Gmx_Guitar.mlapp文件查看源码,并运行程序。
也可直接使用matlab安装Gmx_Guitar.mlappinstall文件,在app选项卡中即可看到安装的程序app。

3.文件构成:

main.m文件是初始编写的程序文件(初始版本,仅作展示),后移植到app中,即Gmx_Guitar.mlapp文件中(其中包括app
designer自动生成的gui代码,以及从初始main.m中整合进来的频谱计算代码)。
Gmx_Guitar.mlappinstall为打包好的matlab
app安装包,可以直接使用matlab中的app安装功能安装本程序,可以像使用其他app一样便捷。

4.内容

使用MATLAB的audioDeviceReader获取设备(命名为deviceReader)并为声卡指定采样参数,运行deviceReader,获取指定长度的输入时间序列片段。
使用noiseGate设置并获取噪声门对象(gate),带参数运行gate获取经过噪声门后的输出。
使用buttord,butter,filter函数设计和实现带通滤波器,序列通过滤波器获取到输出序列。使用fft获取输出时间序列的N点DFT,为了更加细致的观察到波形,使用时域序列补零的方式来达到目标。
使用MATLAB 的APP Designer 工具设计自己的App UI界面,拖动组件实现页面的布局和设置,包括按钮、指示灯、表盘、绘图框、字符提示框等,并为这些组件设置相应的回调函数,使得组件被触发时调用以上介绍的函数进行运算,得到结果后同步到UI界面中显示。

5.实验原理

如Figure 2:系统框架 所示,本系统将信号一步步进行处理,同时将中间过程中噪声门的静态参数和带通滤波器的频率响应,以及FFT之前的时域信号和N点FFT后的频域信号显示出来,方便学习和理解,以及为后期的参数可调优化做铺垫。
Figure2 系统框架
首先使用audioDeviceReader获取来自设备的实时音频,将信号通过噪声门将低于阈值-20dB的声音信号滤除,之后通过通带边界频率为70Hz-350Hz,阻带边界频率为40Hz-400Hz的带通滤波器,滤除吉他调弦所用频率(82.4Hz——329.6Hz)之外的成分,将滤除后的时间信号实时显示在绘图窗中。之后对序列做N点FFT,得到频谱序列,并将频谱序列显示在绘图窗中,寻找频谱序列中幅度最大值,计算相应频率,与吉他的六根弦的标准频率做比较,选取最近的一根最为目标(吉他弦的松动或者变紧是在原来标准频率上的左右小幅变化),使用App中的表盘指示当前的差值,当调节准确时,点亮指示灯,表明调节完成。
扩展器是具有两个增益电平的放大器,高于阈值的输入信号的增益电平是1,低于阈值的增益电平小于1,其中阈值电平可以在输入信号的一个很大范围内调整。扩展器可以通过增大高电平信号,削弱低电平信号来扩展一个信号的动态范围。扩展器的用阈值电平,起控时间,施放时间,来描述。从低电平越过阈值电平时,增益变化到目标值所用的时间就是起控时间,相反从高电平越过阈值电平增益的反应时间就是施放时间。噪声门是一类特殊的扩展器,它将低于阈值电平的信号大大衰减,从而达到降噪的目的,在此处使用噪声门可以方式环境中的噪声误触吉他调音器。
带通滤波器的设置,可以很好的起到降低采样率(本实验采用1KHz采样率),在相同点数FFT运算的情况下提高采样时间,即可以增加频域的分辨率,同时还可以起到防混叠滤波器的作用。我们只需要检测吉他的六根弦,分别是E、A、D、G、B、E1,频率依次是82.4Hz、110Hz、146.8Hz、195.997Hz、246.94Hz和329.6Hz,所以采用1024Hz采样率足够。
FFT变换采用补零的措施达到更加细致的观察到频谱的差异。采样率1024Hz,每次从设备读取序列片段framelength=256,做N点DFT(N=3*framelength),获取到频谱,然后从中获取到幅值最高点,计算相应的频率,即为当前获取到的音调,与目标对比后,给出调节建议。
由于本系统的目的是识别出FFT后序列的最高峰值的频率,无需识别出对应的具体幅值,因此,实验中代码专注于寻找最大值,而不在意最大值是多少,所以频谱的显示并非是具体的幅值,指具有大小的相对性,不具有绝对性。

6.系统功能

  1. 本系统的主要功能是吉他调音,纠正吉他的弦音。
  2. 本系统可以实时采集音频。采样率1024Hz,每秒更新4次,每次获取256个时域序列,实时更新,同时又保证了一定的持续时间方便采样判断的准确性。
  3. 本系统可以依据弦之间的差异和变动的微小型,自动识别当前的弦,无需手动设置,改进了背景中介绍的网页版吉他调音器,提高了实用性。
  4. 本系统改进了网页版的吉他调音器,加入了噪声门,减少了环境噪声的干扰。但同样的需要拨弦的力度适当,过小的拨弦是不会触发识别的。点击噪声门按钮可以显示噪声门静态参数,如(Figure 4: app运行后的界面介绍 )中标号4所示,点击后如(Figure 6 噪声门静态参数)所示。同时带通滤波器的频率响应也可以点击带通滤波器按钮查看,如(Figure 5:带通滤波器频率响应)所示。
    Figure3 噪声门示意图
  5. 实时显示当前的时域序列和频域FFT计算结果,如(Figure 4: app运行后的界面介绍)中标号5和6所示。一来是方便理解学习,二来是为了防止弦音调变动较大,自动识别出现问题,则此时需要依据频域条形图峰值的显示来调整当前的弦音。
  6. 图形化指示功能。使用表盘加指示灯的形式指示当前的弦和与目标的差距。如(Figure 4: app运行后的界面介绍)所示,标号7展示的是误差表盘和误差指示灯,当误差在2Hz以内时,点亮指示灯。
  7. 图形化界面,支持MATLAB app安装,可以将此组件长久地集成到MATLAB中。如(Figure 7:安装以后效果)所示,可以在App标签页下我的App中看到安装的Gmx_Guitar。
    Figure4 app运行后的界面介绍
    Figure5
    Figure6 噪声门静态参数
    Figure7 安装以后效果

7.参考文献及资料

1.CSDN Matlab 关于补零和延拓来提高FFT频谱的细节https://blog.csdn.net/dujiahei/article/details/99703109?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
2.Matlab中FFT后的频谱幅度为什么要乘以2/N? https://www.zybang.com/question/396d2bd4c38bc9f4200b4fc1c40632aa.html
3.百度 吉他调音原理 https://jingyan.baidu.com/article/f25ef2544b8b87482c1b8282.html
4.MATLAB Help Center Audio Toolbox https://ww2.mathworks.cn/help/audio/index.html
5.CSDN 基于matlab-GUI数字音频处理系统 https://blog.csdn.net/a947877846/article/details/78751686
6. MATLAB Help Center Develop Apps Using App Designer https://ww2.mathworks.cn/help/matlab/app-designer.html?lang=en

8.部分代码(全代码见附件)

		properties (Access = public)
        %Property % Description
        %%所有变量定义和初始化,只能初始化具体数值
        
        %%定义采样率和每次读取的片段长度以及fft变换的位数
        Fs=1024;% 采样率
        frameLength = 256; %每次读取的片段长度
        N; %N = frameLength*3; %FFT变换的位数
        E=82.41;A=110;D=146.83;G=196.00;B=246.94;E1=329.62;%吉他的六根弦的频率值
        Guitar; %Guitar=[E A D G B E1]; %打包成数组
        %% 获取输入设备  设置采样率 实时处理片段长度 采样比特 输出数据类型
        deviceReader; %deviceReader = audioDeviceReader('SampleRate',Fs,...
        %'SamplesPerFrame',frameLength,...
        %'BitDepth','16-bit integer',...
        %'OutputDataType','double');
        
        %% 噪声抑制 使用扩展器中的特殊类型 噪声门 抑制低于阈值的噪声达到防止噪声误触的效果
        gate; %gate = noiseGate('Threshold',-25,'AttackTime',0.02,...
        %'ReleaseTime',0.02,'HoldTime',0,'SampleRate',deviceReader.SampleRate); %阈值为-25dB,低于此值的信号将被置零,注意存在应用时间和释放时间 
        %visualize(gate);%可视化噪声门增益函数
        
        %% 带通滤波器截取吉他弦的频谱范围内的信号
        Wp; %Wp = 2*[70 350]/Fs; %吉他的6根弦的自然拨动频率在82.4Hz到329.6Hz之间
        Ws; %Ws = 2*[40 400]/Fs;
        Rp = 3;
        Rs = 40;
        N1;Wn1; %[N1,Wn1] = buttord(Wp,Ws,Rp,Rs);%带通滤波器阶数估计
        num;den; %[num,den] = butter(N1+10,Wn1,'bandpass');%增加滤波器阶数以提高滤波效果
        %freqz(num,den);%可视化滤波器的频率响应
        si; %si = zeros(1,max(length(num),length(den))-1); %初始化直接二型转置实现的初始条件
 
       

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值