信号与系统(2)---录制和播放采样率关系对于声音信号的影响

2023-10-24 01:20

本文主要是介绍信号与系统(2)---录制和播放采样率关系对于声音信号的影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本博文是“信号与系统”系列博文的第二篇,主要依托于“信号与系统”课程设计,后续还会继续推出第三篇,希望大家持续关注!!

文章目录

  • 前言
  • 一、特定采样率声音信号录制
  • 二、特定采样率声音信号播放
    • 3.结果分析
      • (1)声音信号播放角度
      • (2)时频域分析角度
    • 4.现象原理说明
  • 总结


前言

上篇博文介绍了采样率对于声音信号采集的影响,并且从声音信号播放和时频域波形分析两个角度阐释了采样率对于声音信号采集具体会产生哪些影响。本博文继续以“采样率”为抓手,研究采样率的另外一个问题---“录制和播放采样率关系对于声音信号的影响”。
下面开始我们的正文部分,由于在上篇的博文中已经介绍过采样的相关知识以及“奈奎斯特采样定理”,因此本篇博文直接从代码入手研究“录制和播放采样率关系对于声音信号影响”。

一、特定采样率声音信号录制

研究“录制和播放采样率关系对声音信号影响”前提条件是以特定采样率录制声音信号。
recorder = audiorecorder;Fs2 = 44100;              %设置特定的采样率为44100Hz(生活中常见的采样频率) 
nBits = 16;
NumChannels = 1;recorder = audiorecorder(Fs2,nBits,NumChannels);  % 调用电脑麦克风,开始声音录制disp('strat speaking:');
recordblocking(recorder,7);   % 录制7s的声音信号
disp('stop speaking');

二、特定采样率声音信号播放

前面代码实现以特定采样率 Fs = 44100Hz 采集一段时长为7秒的语音信号,接下来实现以特定的采样率播放该录制的声音文件。项目研究的目的在于探讨录制和播放采样率对于声音信号的影响,因此在播放采样率设置时设置“一半”“两倍”“相同”三种情况进行研究。
myrecording = getaudiodata(recorder);         %getaudiodata--读取声音信号信息
audiowrite('data_record.wav',myrecording,44100)
info = audioinfo('data_record.wav')
audiowrite('data_record1.wav',myrecording,22050)
info1 = audioinfo('data_record1.wav')
audiowrite('data_record2.wav',myrecording,88200)
info2 = audioinfo('data_record2.wav')% sound(myrecording,44100) % 播放时采样率设置为与录制时相同
% sound(myrecording,22050) % 播放时采样率设置为录制时的一半
% sound(myrecording,88200) % 播放时采样率设置为录制时的二倍

3.结果分析

针对于结果分析板块,与上篇博文相同,从两个不同的角度进行结果的分析,首先便是从声音信号播放的角度直观感受录制和播放采样率关系对于声音信号的影响,另外便是借助时频域分析更加清晰深刻的分析其对声音信号的影响。

(1)声音信号播放角度

在matlab中,借助于sound命令即可以特定的频率播放声音信号,本项目中分别设置“相同”“一半”“二倍”三种情况分析采样率关系对于声音信号的影响。
声音信号录制的采样率为 Fs = 44100Hz,如果播放时采样率为44100Hz,即录制和播放时采样率相同,此时,播放录音文件,听到的为正常声音信号,清晰洪亮。
但此时如果将播放时的采样率设置为Fs = 22050Hz,即录制和播放采样率关系为“一半”,此时声音信号播放速度变缓,声音变得更加低沉;此时如果将播放时的采样频率设置为Fs = 88200Hz,即录制和播放采样率的关系为二倍,此时声音信号播放速度加快,声音音调变高,略显刺耳。

(2)时频域分析角度

上面是从声音信号播放的角度借助于人耳直观感受录制和播放采样率关系对于声音信号的影响,接下来借助于时频域波形进行可视化分析,以另外的方式阐释其对于声音信号的影响。 时频域可视化代码:
% 数据可视化代码
[y,f] = audioread('data_record.wav');
t = 0:seconds(1/f):seconds(info.Duration);
t = t(1:end-1);
subplot(1,3,1)
plot(t,y)
title('采样频率相同')[y1,f1] = audioread('data_record1.wav');
t1 = 0:seconds(1/f1):seconds(info1.Duration);
t1 = t1(1:end-1);
subplot(1,3,2)
plot(t1,y1)
title('采样频率变为“一半”')[y2,f2] = audioread('data_record2.wav');
t2 = 0:seconds(1/f2):seconds(info2.Duration);
t2 = t2(1:end-1);
subplot(1,3,3)
plot(t2,y2)
title('采样频率变为“二倍”')

在这里插入图片描述

录制和播放采样率关系对声音信号的影响

通过时频域波形图可以明显看出录制和播放采样率不同对于音频文件长度有影响,换句话说,录制和播放采样率关系决定音频文件的播放速度。
通过对时频域波形的观察,明显可以看到当播放时采样率设置为录制时的一半时,声音文件的音频长度变为源文件二倍,当播放时采样率设置为录制时的二倍时,声音文件的音频长度变为源文件一半,但是如果观察三个音频文件的时域波形,发现波形完全一致,通过上述可以得到,录制和播放采样率关系对于音频文件内容没有影响,改变的为音频文件的长度,换句话说改变音频文件播播放的速度。

4.现象原理说明

为方便理解项目现象的原理,在这里对采样率的定义做一下补充,所谓“采样率”,即 每秒从连续信号中提取并组成离散信号的采样个数 。
声音文件录制时,以特定的采样率录制音频文件,只要满足“奈奎斯特采样定理”就可以采集到完整,丰富的声音信号。
而在声音信号播放时,按照自己的理解,相当于在已有音频文件的基础上进行二次采样,由于声音文件的内容是固定的,即音频文件样本数目是固定的,当我们以之前一半的采样率进行二次采样时,相当于每秒钟采集到的样本数目是减半的,因此,如果采集同样大小的音频样本,所需要的时间变为之前二倍,但是由于音频内容未发生改变,所以仅仅改变的是音频文件的播放速度,实现0.5倍速播放或者2倍速播放。

总结

本博文依托“信号与系统”课程设计,承接上篇文章,继续针对采样率展开研究探讨,通过matlab编码以及时频域分析阐释“录制和播放采样率对于声音信号的影响”,论证倍速播放的实现原理,并借此加深对于采样率的理解。
本博文依托课程设计,如有偏驳,敬请指正,共同学习!!

项目已上传至GitHub,GitHub地址:
https://github.com/booue/signals-processing

这篇关于信号与系统(2)---录制和播放采样率关系对于声音信号的影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271756

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方