大家首先就要问了 学霸的标题是神马意思呢??? 顾名思义 就是要把周董变成萌妹子----萌得我一脸血。。。
尤其是那个“mua”都让学霸我不淡定了。。。总之我要表达的意思是!!!对于各种宅而言 这里的这些繁琐的准备绝对是值得的!!!(话说不是技术宅应该也不会被本标题吸引进来的吧???不过既来之则安之。。。)
咳咳。。。学霸就先不做过多的剧透了
咳咳。。。再说一下motivation吧。。。。周萌妹最近在网上貌似很火 学霸又苦于没有音乐编辑软件 才会突发奇想用万能matlab来编辑音乐--------事实证明:matlab效果拔群 鸡肉味嘎嘣脆
(如果你真要告诉我 你进来不是为了matlab而进来 而是要看周董变成萌妹子。。。那我只能说你确定你不会用matlab吗???真的确定???好吧。。。你可以直接跳到页尾享受成果了 不过敬告技术宅 如果你是技术宅而且你还直接跳到页尾那真的天理难容了 这么做会失去所有的matlab乐趣 -------总之我不是技术宅 我是物理学霸。。。。)
学霸先来说接下来我们需要准备的材料
1. MATLAB ---(神马。。你没matlab。。。找你身边的技术宅借吧。。。。)
2. 甜甜的 --- (没错 就是周董的《甜甜的》,神马。。你没有甜甜的。。。去搜狗下吧。。。神马你不会下。。。好吧 周董的其他歌也可以。。。不过效果我不做保证)
我们需要的材料就这两个而已了~~~
顺便提一下很重要的一点!!!!
甜甜的必须是.wav格式的 (如果你的甜甜的是MP3 格式的 可以用这个网站转换 http://media.io/) 转换出来有40M多 不要惊讶
而且文件名最好改成英文的 (中文文件名会出问题 比如学霸就用ttd.wav)
我们界内有句行话。。。MATLAB除了生孩子就没有干不了的。。。。。那么接下来就打开MATLAB鉴证奇迹的周萌萌吧~~~
么么哒~~~ 咳咳。。。在开始之前学霸再装逼一下。。。。
今天学霸要再来再次证实那个theorem。。。。物理学家是万能的。。。。这点东西小case。。我好歹也是在caltech打酱油时干过dsp的。。。。。(是打酱油干dsp还是干dsp打酱油已经不重要了鸭梨)
先来谈谈这个算法的原理吧
原理很简单 傅立叶变换 升频 再反变换回来
一开始学霸把整首歌的频率升高 然后才发现这种做法太naive。。。。速度跟着一起升高了
然后学霸研究了这种方法 把歌切成一节一节的(每节~0.1秒) 然后每节分别升高频率 时长不变 效果拔群 至于细节自己看代码吧
(以下代码由学霸在英文界面写的 中文注释部分为之后添加 如果编译不通过把中文部分去掉~~~)
%%%%%HERE WE GO!
[y,Fs] = wavread('/Users/apple/Music/ttd.wav'); %change to your own directory %must be wav file 读文件 把路径改成自己文件的位置就不用多说了吧 记得要wav格式的哦
% y=wave
% Fs=sampling rate
yleft=y(:,1); %左右声道分开 貌似不分开也可以 学霸避免麻烦还是分开了
yright=y(:,2);
=748*12; %interval length % ~ 0.1 second %接下来的算法把一段波分成一节一节的 经过学霸测试m取这个指效果最佳
L=length(yleft); %song length
amp=1.25; %pitch amplificiation %要把周董的频率升高多少倍就修改这个值 学霸测试1.25最萌 最萌哦!!!
%%%%%%%%%%%%%change left channel %先从左声道开始干
y1=yleft;
y1f=y1;
%%%%%%%%%%%
% TEMP=zeros(m,1);
% TEMP2=TEMP;
%%%%
x=0;
while x+m<L
up=x+m;
temp=y1(x+1:up); %%%%
TEMP=dst(temp);%discrete sin transform %%%%%为什么用sin变换 因为我不想把复数扯进来
TEMP2=zeros(m,1); %to be amplified
for i = 1: round(length(TEMP)/amp)
if round(amp*i)>m
k=m;
else
k=round(amp*i);
end
TEMP2(k)=TEMP(i);
end
emp=idst(TEMP2);%inverse transform %%%%
y1f(x+1:up)=temp;
x=round(up-m/2); %update -m/2 to make it more continuous
end
yleftmod=y1f;
%sound(y1f,Fs)
%%%%%%%%%%%%%change right channel---all same 同样把右声道也改了
y1=yright;
y1f=y1;
%%%%%%%%%%%
% TEMP=zeros(m,1);
% TEMP2=TEMP;
%%%%
x=0;
while x+m<L
up=x+m;
temp=y1(x+1:up); %%%%
TEMP=dst(temp);%discrete sin transform %%%%%
TEMP2=zeros(m,1); %to be amplified
for i = 1: round(length(TEMP)/amp)
if round(amp*i)>m
k=m;
else
k=round(amp*i);
end
TEMP2(k)=TEMP(i);
end
temp=idst(TEMP2);%inverse transform %%%%
y1f(x+1:up)=temp;
x=round(up-m/2); %update -m/2 to make it more continuous
end
yrightmod=y1f;
%sound(y1f,Fs)
ymod=[yleftmod,yrightmod]; %两个合起来
wavwrite(ymod,Fs,'tiantiande.wav'); %save to file %写成文件。。。。然后准备好被萌得一脸狗血吧。。。。
(c) 本算法由学霸所创 最终解释权归学霸所有 在不以盈利为目的的情况下 任何人可以使用、传播本算法
再来谈谈不足之处
杂音。。。貌似是分段的结果。。。。没找到啥好方法 解决这个问题 。。。谁有好方法还望不吝赐教。。。。