MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件。
MATLAB的最大特点是附带了很多数字信号处理工具包,基本涵盖了数字信号处理领域中的所有基本算法。
先简单介绍一下如何用MATLAB读写音频文件
读wav文件
[x fs nbits] = wavread('x:\xxxx\abc.wav');
x: 读入的音频数据,以[-1.0, +1.0)的浮点数表示,单声道的话是一个一维数组,双声道的话是一个二维的数组。
fs: 采样频率。
nbits: 量化精度。
写wav文件
wavwrite(x,fs,nbits,'abcde.wav');
输入数据x需要保证在[-1.0, +1.0)的区间内。
播放读入的wav数据
soundsc(x,fs);
画出波形图
plot(x)
具体的基础操作请参考百度。
===============分割线===============
下面给出一个简单的例子算法:flanger
请将以下代码复制到文本文件并命名为flanger.m
%=========================================
function y=flanger(x,SAMPLERATE,Modfreq,Width)
indata = x;
Delay=Width; % basic delay of input sample in sec
DELAY=round(Delay*SAMPLERATE); % basic delay in # samples
WIDTH=round(Width*SAMPLERATE); % modulation width in # samples
if WIDTH>DELAY
error('!!!');
return;
end
MODFREQ=Modfreq/SAMPLERATE; % modulation frequency in # samples
LEN=length(x); % # of samples in WAV-file
L=2+DELAY+WIDTH*2; % length of the entire delay
Delayline=zeros(L,1); % memory allocation for delay
y=zeros(size(x)); % memory allocation for output vector
BL = 0.7;
FF = 0.7;
FB = 0.8;
dout = 0;
for n=1:(LEN-1)
M=MODFREQ;
MOD=sin(M*2*pi*n);
ZEIGER=15+DELAY+WIDTH*MOD;
i=floor(ZEIGER);
frac=ZEIGER-i;
x(n) = x(n) + FB*dout;
Delayline=[x(n);Delayline(1:L-1)];
dout=Delayline(i+1)*frac+Delayline(i)*(1-frac);
y(n) = x(n)*BL + dout*FF;
end
mix = 0.7;
y = indata*(1-mix) + y*mix;
y = y/max(abs(y));
%=========================================
在matlab界面中将当前工作路径Current Directory设置为放置flanger.m的文件夹。然后执行后面的代码。
假设我们需要的采样率是44100Hz,生成一段10秒钟的白噪音,然后将其通过flanger算法,最后保存为flanger.wav
fs = 44100; %设置采样率。
x = randn(10*fs, 1); %产生10*fs个样点的白噪声数据,该数据为服从标准正态分布的伪随机序列。
x = x/max(abs(x))*0.99; %将x的幅度压缩到[-0.99 +0.99]以内,防止写wav文件时出现错误。
soundsc(x,fs); %播放处理前的声音。
y = flanger(x,fs,0.1,0.001); %flanger处理,输出结果为y。
soundsc(y,fs); %播放处理后的声音。
wavwrite(y,fs,'flanger.wav');
这个例子程序里面有个bug,flanger的width参数不能调得太小,以后会进一步修正。
另外程序中的BL、FF、FB三个参数决定了flanger的音色,可以自行调节。
转载请注明出处,谢谢 http://www.douban.co
No comments:
Post a Comment