Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MATLAB版晴天

MATLAB版晴天

作者头像
喜欢ctrl的cxk
发布于 2019-11-08 03:38:30
发布于 2019-11-08 03:38:30
82700
代码可运行
举报
文章被收录于专栏:Don的成长史Don的成长史
运行总次数:0
代码可运行

写在前面:

今天上数学模型实验课要用到MATLAB,我记得之前在知乎上收藏过一个很有趣的回答—— MATLAB能做什么?

答主分享了一个帖子:Matlab如何演奏周杰伦的“晴天”

握草!瞬间就觉得MATLAB真的太强辣! tql! 我一定要好好学习MATLAB!

原帖摘取:

听完这个音乐之后,会有一个很直观的感觉就是,音色跟印象中有比较大的出入。其根本原因在于,在脚本中对do,re,mi等声音定义为纯音,也就是以某个固定频率进行简谐运动所产生的声波。而先前所听过由乐器演奏的音乐,是由复合音组成,也就是不同的纯音混合在一起所形成的复合音。

1. 目标音乐的简谱

首先需要搜索目标音乐的简谱。以“晴天”为例,在“找歌谱”网上能够找到相应的简谱。

对此需要对音乐的基础知识稍作补习,不过相信先用一首自己熟悉的歌曲拿来联系,应该很容易就能上手。

2. 对音符的定义

在这个过程中,需要对节拍稍作注意,最常见的像四分之一拍,八分之一拍,以及十六分之一拍。

以四分之一拍的do为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
do1f= mod4.*cos(2*pi*ScaleTable(5)*f0*t4)

其中涉及节拍,音调以及频率。mod4,ScaleTable及t4的定义,可参见帖子最后的源码。

分享几点我在编程过程中绕的弯路:

像图中所示的这种情况,最初我也是分别做三个音符数据输出,但是整体听下来的效果比较奇怪,也因为我在乐理基础上的欠缺。

最终,我处理的方式是,这三个音符作为9/16拍的mi输出,这样听起来的效果会相对连续些,不知道从音乐方面来看,这么处理的方式是否正确。

类似的情况,这幅图中的do,可作为3/8拍的do输出。

那么针对这些情况,需要在节拍以及时间间隔定义上,额外再定义9/16拍,3/8拍等情况的数据。

3. 乐谱的定义

在最基本的音符定义完之后,就可以着手通过音符来定义乐谱了。根据简谱依次用所定义的音符定义一个声音矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
violin = [mi1e fa1e so1e mi1f fa1e so1e ti1e]

如果出现有和弦的情况,以同样的方式定义和弦的曲子,并与violin的声音矩阵做加法处理。

之后通过sound函数就能够听到整首歌的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sound(s,fs);

同时,如果你想保存这首歌的话,可以通过audiowrite函数来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
audiowrite('Qingtian.wav',violin,fs)

另外,如果已经有一个音频文件想通过Matlab处理,可以通过audioread函数来读取该音频文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
audioread('Qingtian.wav')

以上就是实现Matlab演奏歌曲的整个过程,接下来附上晴天的源代码,如果你有兴趣想用该代码实现别的歌曲的演奏,只需要将violin矩阵中的乐谱矩阵稍作修改,就能实现你所需的效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fs = 44100;
dt = 1/fs;
T16 = 0.2;
t16 = [0:dt:T16];
[temp k] = size(t16);
t2_5 = linspace(0,10*T16,10*k);
t2_25 = linspace(0,9*T16,9*k);
t2 = linspace(0,8*T16,8*k);
t4_5 = linspace(0,6*T16,6*k);
t4 = linspace(0,4*T16,4*k);
t6 = linspace(0,3*T16,3*k);
t8 = linspace(0,2*T16,2*k);
t12 = linspace(0,1.5*T16,1.5*k);
[temp i] = size(t4);
[temp j] = size(t8);

mod2_5 = sin(pi*t2_5/t2_5(end));
mod2_25 = sin(pi*t2_25/t2_25(end));
mod4 = sin(pi*t4/t4(end));
mod4_5 = sin(pi*t4_5/t4_5(end));
mod6 = sin(pi*t6/t6(end));
mod8 = sin(pi*t8/t8(end));
mod12 = sin(pi*t12/t12(end));
mod16 = sin(pi*t16/t16(end));
f0 = 2*146.8;
ScaleTable = [2/3 3/4 5/6 15/16 ...
1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...
2 9/4 5/2 8/3 3 10/3 15/4 4 ...
1/2 9/16 5/8];

% 1/4 notes
do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);
re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);
mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);
fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);
so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);
la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);
ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);
do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);
re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);
mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);
fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);
so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);
la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);
tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);
ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);
do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);
re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);
mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);
fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);
so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);
la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);
ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
blkf = zeros(1,i);

% 1/8 notes
do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);
so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);
la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);
ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
do1_2_5 = mod2_5.*cos(2*pi*ScaleTable(5)*f0*t2_5);
do1_6 = mod6.*cos(2*pi*ScaleTable(5)*f0*t6);
re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
re1_2_5 = mod2_5.*cos(2*pi*ScaleTable(6)*f0*t2_5);
re1_4_5 = mod4_5.*cos(2*pi*ScaleTable(6)*f0*t4_5);
mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
mi1_2_25 = mod2_25.*cos(2*pi*ScaleTable(7)*f0*t2_25);
mi1_2_5 = mod2_5.*cos(2*pi*ScaleTable(7)*f0*t2_5);
fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);
la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);
la1_6 = mod6.*cos(2*pi*ScaleTable(10)*f0*t6);
tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
do2_4_5 = mod4_5.*cos(2*pi*ScaleTable(13)*f0*t4_5);
do2_2_5 = mod2_5.*cos(2*pi*ScaleTable(13)*f0*t2_5);
re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
blke = zeros(1,j);

% 1/16 notes
fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);
so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);
do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);
do1_12 = mod12.*cos(2*pi*ScaleTable(5)*f0*t12);
re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);
mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);
fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);
so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);
la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);
tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);
ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);
do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);
re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);
mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);
fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);
so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);
la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);
ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);
do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);
blks = zeros(1,k);

violin = [blke so1e so1e do1e do1f re1e mi1e...
blke so1e so1e do1e do1e re1s mi1s re1e so0e...
blke so1e so1e do1e do1f re1e mi1e...
blke mi1f re1s mi1s fa1s mi1s re1s fa1s mi1e do1e...
so0e do1e so1e mi1e fa1e mi1e re1e do1s re1s...
mi1e mi1e mi1e mi1e re1s mi1s re1e do1f...
so0e do1e re1e mi1e fa1e mi1e re1e do1s re1s...
mi1e mi1e mi1e mi1e re1s mi1s re1e do1_12 blke ti1s...
do1s do1s do1s do1s ti1s do1e do1e do1s do1s do1s ti1s do1e...
do1e do1s do1s do1s ti1s do1e do1e do1s do1s do1s so1s so1e so1s...
blks so1s so1s so1s so1s so1e so1s so1s so1s so1s so1s so1s fa1s mi1s...
mi1_2_25 blkf do1s do1s do1s do1s...
la0e ti0e do1e so1e fa1e mi1e do1e do1_6...
blkf do1s do1s do1s do1s mi1e do1e...
la0e ti0e do1e so1e fa1e mi1e do1e...
re1_2_5 blkf blkf...
mi1e re1e fa1e mi1f do1e so1e ti1e...
do2e ti1e so1e do1f do1e la1e la1e...
blke la1e so1e so1f so1e fa1e mi1e...
re1e mi1e fa1e mi1_2_5...
mi1e fa1e so1e mi1f fa1e so1e ti1e...
re2e ti1e do2e do2_4_5 blke do2e...
do2e so1e so1e la1e so1e fa1e re1e mi1e...
fa1e so1e la1e do1e la1_6 ti1s ti1f...
mi1e re1e fa1e mi1f do1e so1e ti1e...
do2e ti1e so1e do1f do1e la1e la1e...
blke la1e so1e so1f so1e fa1e mi1e...
re1e mi1e fa1e mi1_2_5...
mi1e fa1e so1e mi1f fa1e so1e ti1e...
re2e ti1e do2e do2_4_5 blke do2e...
do2e so1e so1e la1e so1e fa1e la0e ti0e...
do1e re1e mi1e re1_4_5 mi1e do1_2_5];

s = violin;
s = s/max(s);

sound(s,fs);
audiowrite('Qingtian.wav',violin,fs)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
matlab最炫名族风,matlab版 “最炫民族风” — 跟风之作(附音频效果)(转)[通俗易懂]
晚上看到个帖,matlab演奏卡农,眼前一亮,以前从没想过用matlab出声,作者真乃大牛。看到一条评论:卡农算什么,有本事来最炫民族风。。。。于是我就手贱了。。。 花了几个小时。。。1/3在读懂卡农的程序,1/3在学习简谱知识(还好小学初中学过点),1/3在把简谱转换成代码。。。 不多说,程序如下,欢迎试听哈: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
全栈程序员站长
2022/11/08
2130
用 Mathematica 弹奏卡农(Canon)
用数学软件演奏音乐早已不是什么新鲜事,很早就有人用Matlab弹奏卡农或是最炫民族风,最近我知道还有人用无理数生成一段音乐,很有趣。而我选择用Mathematica弹奏卡农是因为卡农这种谱曲方式很奇妙,体现在程序上也是简洁而优美的。可能有人还不了解卡农是什么,卡农不是指某一首具体 的曲子,而是一种谱曲方式,它把几段相同的旋律在不同的时刻逐次展开,交错的旋律又能相互配合,形成一首完整的卡农。这首用Mathematica演奏的卡农就是大家最耳熟的“帕赫贝尔的卡农”,你可以在它的乐谱中一窥其中的奇妙。 我们关注
WolframChina
2018/05/31
1.7K0
MATLAB好玩的代码_Matlab代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/29
1.5K0
matlab演奏《雨碎江南》
先请大家听一下上面这首曲子,演奏的是著名的古风乐曲《雨碎江南》。你是否已经融入了那一场夜雨,感受到了雨水的清凉。大家一定想问:用的是什么乐器?
巴山学长
2019/07/15
4710
matlab演奏《雨碎江南》
opencl:C++ 利用cl::make_kernel简化kernel执行代码
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/50767201
10km
2019/05/25
1K0
MATLAB分段函数及应用实例
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134071.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/26
4100
MATLAB分段函数及应用实例
matlab串联结构体,按属性创建含有元胞数组的结构体
本文为matlab自学笔记的一部分,之所以学习matlab是因为其真的是人工智能无论是神经网络还是智能计算中日常使用的,非常重要的软件。也许最近其带来的一些负面消息对国内各个高校和业界影响很大。但是我们作为技术人员,更是要奋发努力,拼搏上进,学好技术,才能师夷长技以制夷,为中华之崛起而读书!
演化计算与人工智能
2020/08/14
1.2K0
Matlab系列之信号解调
上一篇对信号调制有进行了些介绍,本篇将对调制后的信号做还原,即解调。偷个懒,只讲几组比较有代表性的解调信号。
狂人V
2021/09/15
1.3K1
Matlab系列之信号解调
Matlab中短时傅里叶变换 spectrogram和stft的用法
在Matlab中,做短时傅里叶变换需要使用函数spectrogram,而在Matlab2019中,引入了一个新的函数stft,下面我们就来看下这两个函数都如何使用。
猫叔Rex
2020/06/29
7.1K0
matlab+vivado设计数字滤波器
两个月在做数字信号处理方面的工作,也是从一个小白刚刚起步,这两天才把fir滤波器给跑通,写文记录下。希望大家欢迎,多多支持。这篇文章写得辛苦,仅仅Word文件就有21页,写了足足两天时间,修修改改。希望大家多多支持,点赞,转发,打赏。
数字积木
2021/04/15
1.1K0
Scratch3.0——助力新进程序员理解程序(十三、音乐)
可以在官网直接下载,个人建议下载离线包,虽然大一些,但是很方便。也可以在我这直接下载
红目香薰
2023/02/10
3840
Scratch3.0——助力新进程序员理解程序(十三、音乐)
原来还可以这样玩matlab!!!
3月7号女神节,matlab爱好者公众号推出特别干货,祝愿关注本公众号的女神芳华不老、青春永驻!!!
巴山学长
2019/07/15
6600
原来还可以这样玩matlab!!!
Matlab 飞机航向INS仿真
close all; clear all; clc; format long %初始化参数 %vx(1)=0.000048637; %vy(1)=0.000206947; %vz(1)=0.007106781; %初始速度 vx(1)=0; vy(1)=0; vz(1)=0; jd(1)=116.344695283*2*pi/360; L(1)=39.975172*2*pi/360; %初始经纬度 %B(1)=-91.637207*2*pi/360;
Pulsar-V
2018/04/18
9560
520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!
昨天发表了一篇用python教你画心形图表白的文章: 想要表白的看这里,教你用python画不同类型的心形图虏获芳心,值得收藏!! 里面详细介绍了各种心形图的画法以及最终的表白神器,值得点赞收藏!!
全栈程序员站长
2022/11/02
3K0
MATLAB仿真-抽取滤波
在ADC的硬件设计中,都需要在模拟输入端加一个低通滤波器,称为抗混叠滤波器,抗混叠滤波器用于限制最高输入频率,如果需要降低采样率,则需要在代码中实现抽取操作,在抽取前也需要抽取滤波器以限制最高频率分量,当原始信号中含有大于fs/(2D)的频率分量(采样率fs,抽取因子D),抽取后的信号会出现混叠,当使用带宽为pai/D的滤波器,可实现抗混叠。
黑马Amos
2023/03/21
5070
MATLAB仿真-抽取滤波
Matlab画图-非常具体,非常全面
强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层画图操作。这类操作将图形的每一个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每一个对象分配一个句柄,能够通过句柄对该图形元素进行操作,而不影响其它部分。
全栈程序员站长
2021/11/18
2.2K0
脉冲压缩及MATLAB仿真
的目标,且在接收窗的相对距离为15m 和 25m,这两个目标在时间上的间隔不足以被用来分辨。
Gnep@97
2023/12/08
8020
脉冲压缩及MATLAB仿真
matlab调用ChatGPT保姆级教程
新模型新气象,天下不会掉馅饼,调用新模型并不免费,而是按0.002美元/1000 tokens计费。
巴山学长
2023/03/15
1.6K0
matlab调用ChatGPT保姆级教程
【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )
Matlab 文档地址 : https://ww2.mathworks.cn/help/matlab/ref/conv.html
韩曙亮
2023/03/30
2.5K0
【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )
C# 从1到Core--委托与事件
  委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
FlyLolo
2020/07/01
6260
推荐阅读
相关推荐
matlab最炫名族风,matlab版 “最炫民族风” — 跟风之作(附音频效果)(转)[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验