matlab电子琴,MATLAB 编写简易电子琴

Bilbili视频:MATLAB 编写简易电子琴

声音模型

声音本质是机械振动产生的波通过介质传播至人耳,这一振动可由函数x ( t ) x(t)x(t)表示,离散化后即为向量x n x_nxn​以及采样率f s f_sfs​,且满足x n = x ( t n ) , t n = n / f s x_n=x(t_n), t_n=n/f_sxn​=x(tn​),tn​=n/fs​.

而MATLAB 中可用sound(x,fs)函数发出一段声音,如下面的代码运行后将发出一段白噪声:

x=normrnd(0,1,1,10000);

fs=5000;

sound(x,fs)1

2

3

琴弦则近似以如下方式振动(数学物理方法等教材有介绍):

x ( t ) = ∑ n = 1 N A n s i n ( 2 π f n t + ϕ n ) x(t)=\sum_{n=1}^{N}A_nsin(2\pi f_nt+\phi_n)x(t)=n=1∑N​An​sin(2πfn​t+ϕn​)

其中基频 f 1 f_1f1​ 决定声音的音高,f n , n > 1 f_n, n>1fn​,n>1决定音色。基频与音阶的部分对应表如下(没有加升降音):

E4 329.63

F4 349.23

G4 392

A4 440

B4 493.88

C5 523.25

D5 587.33

E5 659.25

F5 698.46

G5 783.99

A5 880

B5 987.77

C6 1046.5

D6 1174.66

E6 1318.51

F6 1396.91

G6 1567.98

A6 1760

B6 1975.53

于是,在MATLAB中发出A4音的代码如下:

fs=5000;

t=0:1/fs:1;

f=440;

x=sin(2*pi*f*t);

sound(x,fs)1

2

3

4

5

音色

除基频f 1 f_1f1​外,还有由高阶模式振动产生的倍频,各本征频频的振幅 A n A_nAn​以及相位ϕ n \phi_nϕn​确定了声音的音色,简单起见,假定ϕ 0 = 0 \phi_0=0ϕ0​=0。并加入一个衰减:

x ( t ) = e − t 2 / 2 t 0 2 ∑ n = 1 N A n s i n ( 2 π f n t ) x(t)=e^{-t^2/2t_0^2}\sum_{n=1}^{N}A_nsin(2\pi f_nt)x(t)=e−t2/2t02​n=1∑N​An​sin(2πfn​t)

从网上找到一段任意音高的钢琴音,傅里叶变换后频谱如下:

7a48b12f0febfee83c7915f294d8af4d.png记录下前八个本征频率对应的振幅A n A_nAn​如下:

645.4

183.7

30

20

20

20

20

56

简易电子琴

编写函数piano(f,amp),其中f 为基频,amp为最低的数个本征频率对应的振幅,其中f通过查找键盘输入的音阶对应的频率得到。再循环运行此函数即可

代码如下:

Amp=xlsread('Amp.xlsx');

Amp=1/max(Amp)*Amp;

n=length(Amp);

f=xlsread('frequency.xlsx','B:B');

%To input "exit" to exit

IN=0;

or=1;

while 1 IN=input('','s'); switch IN case 's' or=1; case 'a' or=0; case 'd' or=2; case '1' piano(f(or*7+1),Amp); case '2' piano(f(or*7+2),Amp); case '3' piano(f(or*7+3),Amp); case '4' piano(f(or*7+4),Amp); case '5' piano(f(or*7+5),Amp); case '6' piano(f(or*7+6),Amp); case '7' piano(f(or*7+7),Amp); case 'exit' break otherwise disp('Again'); end

end

function p=piano(f,amp)

fs=32000;

t=0:1/fs:1;

x=0*t;

n=length(amp);

for i=1:n x=x+amp(i)*sin(2*pi*f*i*t);

end

x=x.*exp(-1/(2*0.3^2)*t.^2);

sound(x,fs)

p=1;

end1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

这一电子琴小程序是写着玩的,非常简陋,一个较大的问题就是弹奏很难连续。如果有改进建议欢迎留言

文章来源: blog.csdn.net,作者:certate,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/certate/article/details/113736573

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值