数字信号处理实践——基于matlab的音频信号分析即处理

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


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


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


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


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

下面是音频文件

http://pan.baidu.com/s/1o6n0I8a


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

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

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

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


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


做出上图的matlab代码:

<span style="font-size:18px;">%%******************************************
% 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');</span>


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


<span style="font-size:18px;">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');
</span>




可以通过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有关系了


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

<span style="font-size:18px;">%%******************************************
% 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);</span>


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


前面我们看到的是前馈(forwar-feed)


我们再考虑别的情况,反馈型feedback


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


<span style="font-size:18px;">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</span>


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

下面的部分可以实现低通滤波


%% got the low frequency
out = left;
counter = 0;
for n = 2:length(left)
    out(n,1) = 0.8*out(n-1) + 0.2*left(n);
end


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


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


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




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

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


高通滤波则反之. 






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







评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值