Advertisement

matlab数字音频处理实验报告,数字信号处理实践——基于matlab的音频信号分析即处理...

阅读量:

基于matlab的音频信号分析即处理

一直很多人都困惑,大学里学了数字信号能干嘛,很少又实践动手的机会(这都是看个人主动性的,从来不缺锻炼的机会,机会不会摆在你面前吧!)。很多人也就是做做题目 pray for passing the test.

下面开始介绍如果利用matlab处理音频信号文件。

--------------------------------------------------------------------------------------------------------------------------------------------------

我去,不允许上传音频文件....只好传XX盘了

下面是音频文件

首先利用matlab导入音频数据,这里要注意,matlab只能识别.wav格式的音频文件....

利用wavread函数可以导入音频数据,同样可以利用import data 工具进行数据的导入

[road,fs]=wavread('road.wav');

可以看到,这里data是音频文件的两个声道数据,fs记录的是音频文件的采样频率 fs=44,100 samples/second
0818b9ca8b590ca3270a3433284dd417.png

我们可以按照时间序列观察音频文件的数据信息
0818b9ca8b590ca3270a3433284dd417.png

做出上图的matlab代码:

%%******************************************

% code file : DSP_music_demo.m

% code writer : EOF

% code date : 2014.11.17

% e-mail : jasonleaster@gmail.com

%%******************************************

clear all

close all

clc

% read the music source file by function 'wavread()'

[data fs] = wavread('./road.wav');

% left channel of music is stored in data(:,1);

% right channel of music is stored in data(:,2);

left = data(:,1);

right = data(:,2);

% the sampling frequency of original digital signal.

time = (1/fs)*length(left);

t = linspace(0,time,length(left));

plot(t,left);

xlabel('time(sec)');

ylabel('relative signal strength');

上面的数据点太多,观察起来不便,我们可以再细致的观察段时段内的音频数据,左声道的前2000个点
0818b9ca8b590ca3270a3433284dd417.png

close all

clc

time = (1/44100)*2000;

t = linspace(0,time,2000);

figure;

plot(t,left(1:2000));

xlabel('time(sec)');

ylabel('relative signal strength');

可以通过soundsc()函数测试试听音频数据

soundsc(left,fs)% plays left channel as mono

soundsc(right,fs)% plays right channel mono (sound nearly the same)

soundsc(road,fs)% plays stereo (ahhh…)

好玩的来了,原本没有回声的音频,怎么处理使之具有回声的效果呢?

下面是我们构造回声的模型,以前输入的延迟和当前输入的叠加得到的输出,而回声的明显程度就和这里的Delay有关系了
0818b9ca8b590ca3270a3433284dd417.png

下面的程序简单实现了这个模型,很好玩哟~ 哇咔咔~原来回声可以这么简单的合成

%%******************************************

% code file : echo.m

% code writer : EOF

% code date : 2014.11.17

% e-mail : jasonleaster@gmail.com

%%******************************************

clear all

close all

clc

% read the music source file by function 'wavread()'

[data fs] = wavread('./road.wav');

% left channel of music is stored in data(:,1);

% right channel of music is stored in data(:,2);

left = data(:,1);

right = data(:,2);

leftout = left;

N = 10000;% delay second = N/fs;

% N = fs*0.1;% eg: I want to delay 0.1 second

for n = N+1:length(left)

leftout(n) = left(n) + left(n - N);

end

soundsc(leftout,fs);

同样,我们还可以把左声道回声到右声道,右声道回声到左声道,这在是实现上很简单~不贴代码了。

前面我们看到的是前馈(forwar-feed)
0818b9ca8b590ca3270a3433284dd417.png

我们再考虑别的情况,反馈型feedback
0818b9ca8b590ca3270a3433284dd417.png

注意我把输出信号的延迟量的0.8倍叠加到输入信号,然后作为输出。这是一种正反馈(系数为0.8)。而反馈系数小于1,于是这里回声会慢慢的变弱,越来越弱,以至于人辨别不出来了,但是这种回声不会消失!

out = data;

N = fs*0.1;

for n = N +1:length(left)

out(n,1) = 0.8*out(n-N,1) + left(n);

out(n,2) = 0.8*out(n-N,2) + right(n);

end

下面是关于声音频率的控制处理

下面的部分可以实现低通滤波
0818b9ca8b590ca3270a3433284dd417.png

%% got the low frequency

out = left;

counter = 0;

for n = 2:length(left)

out(n,1) = 0.8out(n-1) + 0.2left(n);

end

下面的部分可以使得播放时声音的高频部分更明显。

如果想改变播放速度,soundsc的参数,直接改变fs即可。

接下来我们看看左声道数据的频谱,发现能量集中在低频段(左右两侧低频,中间是高频段)~
0818b9ca8b590ca3270a3433284dd417.png

我们可以对输入信号进行低通滤波。仅保留低频段的左边20000个点和右边20000个点

你会听到很好玩的低频声音哈哈哈哈哈O(∩_∩)O~
0818b9ca8b590ca3270a3433284dd417.png

高通滤波则反之.

当生活把我们打哭的时候,我们就把生活逗笑 : )
0818b9ca8b590ca3270a3433284dd417.png

全部评论 (0)

还没有任何评论哟~