Post Go back to editing

用matlab把周杰伦变成周婕纶

大家首先就要问了 学霸的标题是神马意思呢??? 顾名思义 就是要把周董变成萌妹子----萌得我一脸血。。。

尤其是那个“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) 本算法由学霸所创 最终解释权归学霸所有 在不以盈利为目的的情况下 任何人可以使用、传播本算法

再来谈谈不足之处

杂音。。。貌似是分段的结果。。。。没找到啥好方法 解决这个问题 。。。谁有好方法还望不吝赐教。。。。


音频文件分享:http://bbs.mahoupao.net/thread-59862-1-1.html

Parents Reply Children
No Data