纹哥--

用matlab把周杰伦变成周婕纶

纹哥-- 在 2014-4-15 建立的討論區
最後回覆由ADIForum於2014-4-30提供

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

 

 

尤其是那个“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

結果