您的位置:首页 > 编程语言 > MATLAB

Matlab实现均匀量化的简单实例

2017-09-02 11:42 330 查看
教学任务是要读取一个声音文件,对前200个采样点进行4bit的均匀量化。自己在网上看了很多资料,博客,最后还是一脸茫然,最后还是自己一点一点写,

虽然也弄出了很多问题,不过最后还是依靠自己解决了,记录下这一次辛勤工作的结果。

        PS:没想到matlab还可以读取声音文件,修改,和播放,再一次体验到matlab实在太强大了。

matlab实现代码如下:

clear all;
clc;
[y,fs,bits]=wavread('road.wav'); %fs得到声音信号的采样率
ft = y(:,1); %假设声音文件有两个声道,我们只分析第一个声道,如果要分析第二个声道可以改为:ft=y(:,2);
sigLength = length(ft); %获取声音长度
sound(y, fs, bits) ;%可以使用sound函数来播放声音
t=(0:sigLength-1)/fs;
figure;
plot(t(1:200), ft(1:200)),grid;
xlabel('Time(s)');
ylabel('Amplitude');
hold on;
min = 999;
max = -999;
M = 16;
for i = 1:200;
if(ft(i) < min)
min = ft(i);
end
if(ft(i) > max)
max = ft(i);
end
end
det = (max - min)/M;
m = zeros(1,M);
for i = 1:M
m(i) = min + i*det;%量化区间的端点
end
%m_i = [min m(1:M-1)]; %
%量化输出电平为量化间隔的中点:qi = (m(i)+m(i-1))/2
%q_i = (m + m_i)/2
qv = zeros(1,200);%存储200个点的均值量化后的数字化的值
node = [min-0.0001,m(1:M-1),max+0.0001];
display(node(1));
for i = 1 : 200; %声音信号的每个采样点
for j = 1:M;
if(node(j) < ft(i) && ft(i) <= node(j+1))
qv(i) = (node(j) + node(j+1))/2;
end
end
%fprintf('qv(%d) = %d\n',i,qv(i));
end
plot(t(1:200), qv(1:200),'r'),grid; 原始声音波形和量化波形效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: