基于matlab的电子琴信号分析
来源:互联网 发布:it技术支持工程师简历 编辑:程序博客网 时间:2024/05/22 05:20
基于matlab的电子琴信号分析
交流电频率是50Hz,当经过电力变压器附近时,我们总会听到“呜呜”的声音,这个信号就是几乎标准的50Hz纯音,夏天蚊子从耳边飞过时候的“嗡嗡”声,也几乎是标准的高频纯音信号。电子琴的频率范围从27.5Hz到4186Hz,远远覆盖了从变压器到蚊子振动翅膀的频率,但是从直观上感觉,这个信号好像和电子琴的任何一个琴键发出的信号都有很大差别。这是为什么?是我们的听觉欺骗了我们,还是电子琴的频率不是单一的标准频率?
任何一本乐理知识上都指出了中央C的音频是261.6Hz,现在我们来分析一下这个信号到底是不是纯音信号。
用matlab生成一个标准的261.6Hz的频率来实际感受一下,程序如下:
clear
fs=8000;
N=8000;
n=0:N-1;
t=n/fs;
x=sin(2*pi*261.6*t);
sound(x,fs);
运行程序后发现这个信号和实际的中央C信号的听觉效果完全不一样,这是什么原因造成的呢?
用录音设备录制中央C的声音,采样频率设定为8000.保存到E盘根目录,我这边命名为E:/DO.wav。现在用matlab进行信号的fft分析得出其频谱。程序如下:
clear
fs_do=8000;%采样频率
x_do=audioread('E:/do.wav'); %信号读入
x_do=x_do';
N_do=8000; %采样点数
n_do=0:N_do-1;
t_do=n_do/fs_do; %以上两行生成时间序列
y_do=fft(x_do,N_do);%fft
mag_do=abs(y_do); %模值
ang_do=angle(y_do);%相角
f_do=n_do*fs_do/N_do; %频率序列
plot(f_do,mag_do);
title('电子琴DO FFT ')
axis([-100 2000 0 200]);
sound(x_do,8000);%声音试听
运行后波形如图(1):
把采集到的声音信号用matlab进行fft以后可以发现除了在大约262Hz有一个尖峰外,在大约520,790,,1050,1350,1580,1850Hz处均有一个逐次递减的尖峰出现,并且在0Hz处出现了一个直流分量。现把fft后的尖峰处的频率,模值,相角提取出来列表如下:
频率
模值
实际模值. 注释1
相角(弧度)
相角(角度)
0
17.8
0.002225
0
0
262
156.8
0.0392
0.8425
48.27525
525
108.7
0.027175
2.8086
160.9328
788
75.95
0.018988
-1.8379
-105.312
1053
41.3
0.010325
-2.1089
-120.84
1317
51.8
0.01295
-2.8593
-163.838
1584
12.86
0.003215
-1.7092
-97.9372
1852
16.66
0.004165
-1.964
-112.537
经以上分析发现,电子琴实际的频率除了在262Hz处有信号以外,还存在直流分量以及基频262Hz的二倍频,三倍频,直至7倍频,除此之外还有相角偏差。
现用matlab进行信号合成并与原始电子琴信号对比,程序如下:
clear
fs=8000;%合成信号采样频率
N=8000; %合成信号采样点数
n=0:N-1;
t=n/fs; %合成信号时间序列
xishu=6*exp(-t*6); %合成信号的系数修正,见注释2
xx=0.00223+0.0392*sin(2*pi*262*t+0.84)+0.0272*sin(2*pi*525*t+2.809)+0.019*sin(2*pi*788*t-0.019)+0.0103*sin(2*pi*1053*t-2.11)+0.0130*sin(2*pi*1317*t-2.86)+0.0032*sin(2*pi*1584*t-1.71)+0.00417*sin(2*pi*1852*t-1.96);%合成信号,见注释3
x=xishu.*xx;%得到最终的合成信号
y=fft(x,N);%fft
mag=abs(y); %合成信号模值
ang=angle(y); %合成信号相角
f=n*fs/N; %合成信号频率序列
sound(x,fs); %合成信号试听
subplot(2,2,1);
plot(f,mag);
title('合成信号fft')
axis([-100 2000 0 300]);
subplot(2,2,2);
plot(x);
title('合成信号波形');
axis([0 4500 -1 1]);
pause(1); %暂停1秒
fs_do=8000;%电子琴信号采样频率
x_do=audioread('E:/do.wav'); %电子琴信号读入
x_do=x_do'; %见注释4
N_do=8000; %电子琴信号采样点数
n_do=0:N_do-1;
t_do=n_do/fs_do; %电子琴信号时间序列
y_do=fft(x_do,N_do);%fft
mag_do=abs(y_do); %%电子琴信号模值
ang_do=angle(y_do); %电子琴信号相角
f_do=n_do*fs_do/N_do; %%电子琴信号频率序列
subplot(2,2,3);
plot(f_do,mag_do);
title('电子琴信号FFT ')
axis([-100 2000 0 300]);
subplot(2,2,4);
plot(x_do);
title('电子琴信号波形')
axis([0 4500 -1 1]);
sound(x_do,fs_do);%电子琴信号声音试听
运行程序后得如下波形:见图(二)
从频域和时域均可发现原始电子琴信号与合成信号很相似,从听觉效果来说几乎分辨不出哪个是电子琴信号,哪个是合成信号,说明合成信号较好地复现了电子琴信号,从而说明电子琴信号不是单频率信号,而是基于基本频率的倍频信号的合成,但是幅值最大的频率依然是基本频率信号,即中央c信号的最大幅值的频率出现在262Hz处。
注释1:信号经过fft后的得到的模值和采样点数有关,从模值到采样模值的转换公式为:0频率处(直流分量)实际模值=模值/采样点数;非0频率处实际模值=模值/(采样点数/2)。且无论采样点数如何影响matlab的模值,但各个模值分量的比值恒定。
注释2:此处信号修正的原因:1,引入系数6使得合成信号的时域波形的幅值范围跟电子琴信号的幅值范围相当。引入对数exp(-t*6)是保证合成信号的波形按时间衰减,并使衰减速度趋近与电子琴实际信号。
注释3:xx=0.00223+0.0392*sin(2*pi*262*t+0.84)+0.0272*sin(2*pi*525*t+2.809)+0.019*sin(2*pi*788*t-0.019)+0.0103*sin(2*pi*1053*t-2.11)+0.0130*sin(2*pi*1317*t-2.86)+0.0032*sin(2*pi*1584*t-1.71)+0.00417*sin(2*pi*1852*t-1.96);此语句是一条语句,不可分开,不可加空格
注释4:在调试过程中发现读入的电子琴信号是N*1矩阵,而合成信号是1*N矩阵,此处引入转置是使得电子琴信号和合成信号均为1*N矩阵。调试过程中发现无论是1*N或 N*1对fft变换,以及实际听觉效果没有影响。此句可删除,从原理上分析合成信号波形和电子琴信号波形应该是相近的,都是幅值随时间变化的,但此处的的矩阵形式为什么不一致的原因不详。
备注:1.若需要我分析时的语音信号,请加我Q索取 410330285
2.纯原创,转载请注明出处http://blog.csdn.net/wly0421
3.能力所限,不妥之处请指正
- 基于matlab的电子琴信号分析
- 基于MATLAB的声音信号频谱分析仪设计
- 基于51单片机的电子琴
- 基于PIC32的激光电子琴
- 基于汇编语言的电子琴设计(1)
- 基于汇编语言的电子琴设计(2)
- 基于汇编语言的电子琴设计(3)
- 基于汇编语言的电子琴设计(4)
- 基于汇编语言的电子琴设计(5)
- 基于fpga的niosii PS2电子琴
- 数字信号处理实践——基于matlab的音频信号分析即处理
- Matlab信号分析
- 基于声卡的数字信号发生器与数字电子琴的实现
- 基于TMS320VC5509A的实时信号分析仪
- 硬件课程设计报告--基于Basys2的多功能电子琴
- 基于51单片机的4×4矩阵键盘电子琴
- 设计电子琴的C语言程序(基于单片机)
- 【电子DIY】基于NE555制作的简易电子琴
- 在Oracle12c上添加了Scott用户,但是为什么再次进入的时候却显示invalid username/password;logon denied
- 最大上升子序列和
- 使用哈希表解决几个常见算法题
- Linux 信号浅谈
- Android开发——View的生命周期总结
- 基于matlab的电子琴信号分析
- ORACLE-常用关键字
- MSSQL:连接EXCEL
- 部署在服务器上的行驶证识别api接口
- YII2框架学习 基础篇(一)
- 325252532
- 程序员至死都不想回答的问题
- mac开发指南
- 鸣人和佐助