音频品质的好坏2个指标——采样率和位深(运用Matlab验证)

《波》简介和采样

“我们将某一物理量的扰动或振动在空间逐点传递时形成的运动称为波”百科定义。
声音也是一种波,在数字领域,通过对模拟信号(声音)的采样,得到数字信号(此数字信号也称之为离散信号)。这个过程,称为:采样。在采样过程中,有2个指标,分别是《采样频率》和《采样位深》。

一、采样频率

采样频率——在一定时间内将连续的模拟信号采样多少次。一般我们说48k采样率,即为1S内采样48000个点,每2个采样点之间时间为1/48000S,即为1/48Ms,也就是1Ms内有48个点。

根据采样定理,数字信号所承载波形的最高频率是采样频率的1/2,即在采样频率(采样率)为48k时,数字信号所能呈现的最高频率为24k。采样频率越高,所承载的信号频率越高。

下图为48k采样率下,1000Hz正弦波信号,1个正弦波周期(即1Ms1个周期),1Ms为48个采样点波形图。可以把连续的波形理解为模拟信号,每个点代表数字信号的采样点。

下图为24k采样率下,1000Hz正弦波信号,1个正弦波周期(即1Ms1个周期),1Ms为24个采样点波形图。可以把连续的波形理解为模拟信号,每个点代表数字信号的采样点。

二、采样位深

采样位深——在每次采样时,每个点的数据存储为多少bit。音频在数字信号中,振幅范围为[-1,1],也可以把采样位深理解为将振幅[-1,1]划分为多少级。举个极端、简单的例子,情况①:采样精度为1时,那么采样到数据为-1,0,1。仅三级。情况②:采样精度为0.1时,那么采样到数据为-1,-0.9,-0.8……-0.1,0,0.1……0.8,0.9,1。有21级。所以采样位深越高,所承载的信号的精度越高。

一般我们常看到音频采样位深为16Bit、24Bit。意思是2进制数16位、24位。16位2进制数所能表达的数据范围为-32767-32767。24位2进制数所能表达的数据范围为-8388607~8388607。

 

理解以上2个概念后,我通过MATLAB来绘图解释这2现象。

1、验证采样率:将原信号进行降低采样率后,在下图左边部分能明显看出来信号的快速抖动没有了(即高频没有了,因为由于采样率下降,数字信号所能承载的最高频率下降了)。

2、验证采样位深:将原信号进行降低位深后(此处是通过保留小数点位数达到降低划分多少级的目的),在下图能明显看出来信号的连续变化没有了,出来了许多折线(信号线越平滑,表示原信号的相邻点的连续性越强)。


放个大图来看看数据位深(数据精度)造成的问题。


三、关于音质改善的认识

以上仅从数字信号领域浅谈《波》的2个指标。在现实场景中,我们一般所遇到的均是数字音频(即存储在计算机中的音频),而在实际的应用场景中是将数字的音频信号通过“数模转换”后,再通过放大电路和播放设备(喇叭、耳机等)播放出来

我们常见的HIFI、高音质等名词,一般均指数字音源的参数(采样率和位深)。

关于采样率:初中物理课本中讲人耳能听到的频率为20Hz——20000Hz,而且一般人大概17000~18000Hz以上都听不到,而且年龄越大,能听到的最大频率越小。

而在数字信号中,采样率越高,所能承载的信号频率越高,最高频率为采样率的一半。即采样48k时,能承载的24k,也就是24000Hz。(在我看来,这个采样率已经足够高了,因为即使采样率再高,放出来的音频频率人耳也已经听不到了,所以再高也无意义了)

关于位深:我们一般能看到16Bit/24Bit等指标,这个指标可以说是越高越好,但也要跟后边的DAC、放大电路、播放设备相匹配。(经过我的测试,大多数都听不出16Bit,24Bit的区别,所以我觉得24Bit以上,也都已经无意义了)

综上,如果要改善听感,必须找到这4个环节中的瓶颈,哪个弱改善哪个。不能一味的直追求音源的高品质,而忽略了后面的环节带来的问题。

 

以下附上Matlab程序

建立一个"check_FS_Bit"文件夹和"OrigWav.wav"文件,即可直接运行以下程序。我使用的是Matlab 2016a版本。

%% 读取源数据
[inSoc, fs] = audioread('check_FS_Bit\OrigWav.wav');
inSoc = inSoc(:,1);     %只取单声道做处理
%% 把读取到的wav长度凑成8的整数倍取整
if (mod(length(inSoc),8) ~= 0)
    inSoc = [inSoc;0];
    if (mod(length(inSoc),8) ~= 0)
        inSoc = [inSoc;0];
        if (mod(length(inSoc),8) ~= 0)
            inSoc = [inSoc;0];
            if (mod(length(inSoc),8) ~= 0)
                inSoc = [inSoc;0];
                if (mod(length(inSoc),8) ~= 0)
                    inSoc = [inSoc;0];
                    if (mod(length(inSoc),8) ~= 0)
                        inSoc = [inSoc;0];
                        if (mod(length(inSoc),8) ~= 0)
                            inSoc = [inSoc;0];
                        end
                    end
                end
            end
        end    
    end    
end
%% 重采样操作
outSoc1 =  resample(inSoc,floor(fs/2),fs);
outSoc2 =  resample(inSoc,floor(fs/4),fs);
outSoc3 =  resample(inSoc,floor(fs/8),fs);

%% 将生成的wav输出
audiowrite('check_FS_Bit\OutWav1.wav',outSoc1, floor(fs/2));
audiowrite('check_FS_Bit\OutWav2.wav',outSoc2, floor(fs/4));
audiowrite('check_FS_Bit\OutWav3.wav',outSoc3, floor(fs/8));
%% 作图
figure(1);
subplot(4,1,1);plot(inSoc);     legend('原波形');
subplot(4,1,2);plot(outSoc1);   legend('降1倍采样率');
subplot(4,1,3);plot(outSoc2);   legend('降2倍采样率');
subplot(4,1,4);plot(outSoc3);   legend('降4倍采样率');
%% 降低精度操作
outBitSoc1 =  round(inSoc,3);
outBitSoc2 =  round(inSoc,2);
outBitSoc3 =  round(inSoc,1);
%% 作图
figure(2);
subplot(4,1,1);plot(inSoc);     legend('原波形');
subplot(4,1,2);plot(outBitSoc1);   legend('保留3位小数');
subplot(4,1,3);plot(outBitSoc2);   legend('保留2位小数');
subplot(4,1,4);plot(outBitSoc3);   legend('保留1位小数');
%% 作图
figure(3);
clf;
plot(inSoc,'*');        hold on;
plot(outBitSoc1,'b');	hold on;
plot(outBitSoc2,'c');	hold on;
plot(outBitSoc3,'r');   legend('原信号','保留3位小数','保留2位小数','保留1位小数');
axis([9,19,-0.45,-0.15]);

本人新建了个QQ群,如想进一步沟通可添加:947187213。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于深度强化学习DQN的FlappyBird游戏自动玩耍python源码+项目说明+超详细注释+模型.zip 主要环境依赖 Python 3.7.0 Tensorflow 1.12.0 Pygame 1.9.6 模型结构 使用深度卷积网络DCNN与全连接神经网络的结合,对Flappy Bird游戏强化学习进行了值函数逼近。使用游戏实时的数据(状态-动作-回报)作为值函数优化的训练集。 动作空间的动作数为2,可以进行one-hot编码,其中第一位表示无动作,第二位表示“flap”动作。DCNN对连续4帧游戏画面进行采样,最终网络的输出维数与动作空间的维数相等,即为一个2维数组,表示在该状态下所估算的值函数。 经验池 为了供训练使用数据集,构造了一个容量为50000的队列作为经验池,用于存放游戏的决策经验(当前状态,即时动作,即时回报,终止标志,下一步状态)。在最初10000步,先不对网络进行训练,而是直接使用初始化网络,并以 ϵ-greedy 策略进行决策,以产生初始经验,然后10000步后使用这些初始经验进行网络训练,同时以实时游戏经验更新经验池。 ϵ-greedy 策略 在 ϵ-greedy 策略中,该程序设置ϵ初始值为0.1,即以0.1的概率进行随机探索,此处之所以设置ϵ=0.1,是由于若ϵ太大,agent将会以较高的频率进行“flap”,会使得agent触碰上壁或上管道,导致游戏过早终止。这将会导致游戏状态单一,Q网络所能学习到的状态也较少,网络收敛较慢。 训练 训练迭代次数设置为3000000次,实际上可以无限制,次数越大,效果越好。训练使用数据为batch size为32的4通道图像,这是由于单一的一帧图像为静态图像,难以反映连续的状态与动作的变化。后期将探究使用更多帧的图像作为输入数据,并加深DCNN,观察效果。 效果仍然欠佳,但相比初始未训练时,已经勉强可以越过一个管道。随着迭代的次数继续推进,效果将越来越好。后期将公布迭代次数更大的更好效果。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值