基于matlab的电子琴信号分析

来源:互联网 发布:it技术支持工程师简历 编辑:程序博客网 时间:2024/05/22 05:20

                     基于matlab的电子琴信号分析

交流电频率是50Hz,当经过电力变压器附近时,我们总会听到“呜呜”的声音,这个信号就是几乎标准的50Hz纯音,夏天蚊子从耳边飞过时候的“嗡嗡”声,也几乎是标准的高频纯音信号。电子琴的频率范围从27.5Hz4186Hz,远远覆盖了从变压器到蚊子振动翅膀的频率,但是从直观上感觉,这个信号好像和电子琴的任何一个琴键发出的信号都有很大差别。这是为什么?是我们的听觉欺骗了我们,还是电子琴的频率不是单一的标准频率?

任何一本乐理知识上都指出了中央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有一个尖峰外,在大约520790,10501350,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)是保证合成信号的波形按时间衰减,并使衰减速度趋近与电子琴实际信号。

注释3xx=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*1fft变换,以及实际听觉效果没有影响。此句可删除,从原理上分析合成信号波形和电子琴信号波形应该是相近的,都是幅值随时间变化的,但此处的的矩阵形式为什么不一致的原因不详。


备注:1.若需要我分析时的语音信号,请加我Q索取 410330285

      2.纯原创,转载请注明出处http://blog.csdn.net/wly0421

      3.能力所限,不妥之处请指正



原创粉丝点击