采样
采样频率
每秒从连续信号中提取并组成离散信号的采样个数。用Hz表示,采样频率的倒数是采样周期,即采样之间的时间间隔。
通俗的讲:采样频率是指计算机每秒钟采集的多少声音样本。采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。
采样定理
也称作奈奎斯特采样定理,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。所以采样定理确定了信号最高最高的频率上限,或能获取连续信号的所有信息的采样频率的下限。
举例:如果有一个20Hz的语音和一个20KHz的语音,我们以44.1KHz的采样率对语音进行采样,
结果:20Hz语音每次振动被采样了$\frac{40K}{20}=2000$次;
20KHz语音每次振动被采样了$\frac{40K}{20K}=2$次;
所以在相同的采样率下,记录低频的信息远远比高频的详细。
上采样可以理解为信号的插值,下采样可以理解为信号的抽取。
带宽:采样频率的一半,最高频率等于采样频率的一半。
混叠
混叠也称为欠采样,当采样频率小于最大截止频率两倍(奈奎斯特频率)的时候就会发生信号重叠,这一现象叫做混叠。
为了避免混叠现象,通常采用两种措施:
- 1、提高采样频率,达到信号最高频率的两倍以上;
- 2、输入信号通过抗混叠滤波器(低通滤波器)进行滤波处理,过滤掉频率高于采样率一半的信号。
语谱图和频谱图
语音波形图
波形图表示语音信号的响度随时间变化的规律,横坐标表示时间,纵坐标表示声音响度,我们可以从时域波形图中观察语音信号随时间变化的过程以及语音能量的起伏
import matplotlib.pyplot as plt import numpy as np import librosa plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] #用来正常显示中文标签 plt.rcParams[\'axes.unicode_minus\']=False #用来正常显示符号 fs = 16000 audio, _ = librosa.load("./p225_001.wav", sr=fs) audio = audio[5920:15000] time = np.arange(0, len(audio)) * (1.0 / fs) plt.title("语音信号", fontsize=14) plt.plot(time, audio, color=\'C0\') plt.xlabel("时间/s", fontsize=14) plt.ylabel("振幅", fontsize=14) plt.tight_layout() plt.show()
频谱图和相位图
频谱图表示语音信号的功率随频率变化的规律,信号频率与能量的关系用频谱表示,频谱图的横轴为频率,变化为采样率的一半(奈奎斯特采样定理),纵轴为频率的强度(功率),以分贝(dB)为单位
# Author:凌逆战 # -*- coding:utf-8 -*- import matplotlib.pyplot as plt import numpy as np import librosa plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 指定默认字体 plt.rcParams[\'axes.unicode_minus\'] = False # 用来正常显示符号 fs = 16000 audio, _ = librosa.load("./p225_001.wav", sr=fs) audio = audio[5920:15000] time = np.arange(0, len(audio)) * (1.0 / fs) # plot time signal: # plt.figure(figsize=(6,8)) # plot different spectrum types: plt.subplot(2,2,1) plt.title("(a) 幅度谱图") plt.magnitude_spectrum(audio, Fs=fs, color=\'C1\') plt.xlabel("频率", fontsize=13) plt.ylabel("幅度 (能量)", fontsize=13) plt.subplot(2,2,2) plt.title("(b) 对数幅度谱图") plt.magnitude_spectrum(audio, Fs=fs, scale=\'dB\', color=\'C1\') plt.xlabel("频率", fontsize=13) plt.ylabel("幅度 (dB)", fontsize=13) plt.subplot(2,2,3) plt.title("(c) 相位谱图") plt.phase_spectrum(audio, Fs=fs, color=\'C2\') plt.xlabel("频率", fontsize=13) plt.ylabel("相位 (弧度)", fontsize=13) plt.subplot(2,2,4) plt.title("(d) 角谱图") plt.angle_spectrum(audio, Fs=fs, color=\'C2\') plt.xlabel("频率", fontsize=13) plt.ylabel("角度 (弧度)", fontsize=13) plt.tick_params(labelsize=15) # 设置刻度字体大小 plt.tight_layout() plt.show()
语谱图
横坐标是时间,纵坐标是频率,坐标点值为语音数据能量,能量值的大小是通过颜色来表示的,颜色越深表示该点的能量越强。一条条横方向的条纹,称为“声纹”。它因人而异,即不同讲话者语谱图声纹是不同的,因而可以用声纹鉴定不同的讲话人。语谱图中的花纹有横杠、乱纹和竖直条等,横杠是和时间轴平行的几条深色带纹,它们相应于短时谱中的几个凸出点,即共振峰,有没有横杠出现是判断它是否是浊音的重要标志。
语谱图频率和时间值是离散的,每个代表一个“bin”,而振幅是实值。颜色显示在离散坐标(时间,频率)振幅的实值
import matplotlib.pyplot as plt import numpy as np import matplotlib import librosa from matplotlib.ticker import FuncFormatter plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] # 用来正常显示中文标签 # plt.rcParams[\'font.sans-serif\'] = \'Times New Roman\' # 中文设置成宋体,除此之外的字体设置成New Roman plt.rcParams[\'axes.unicode_minus\'] = False # 用来正常显示符号 fs = 16000 audio, _ = librosa.load("./p225_001.wav", sr=fs) # audio = audio[5920:15000] fig = plt.figure() norm = matplotlib.colors.Normalize(vmin=-200, vmax=-40) ax_1 = plt.subplot(1, 1, 1) plt.title("语谱图", fontsize=14) plt.specgram(audio, Fs=fs, scale_by_freq=True, sides=\'default\', cmap="jet", norm=norm) plt.xlabel(\'时间/s\', fontsize=14) plt.ylabel(\'频率/kHz\', fontsize=14) plt.xticks(fontsize=14) plt.yticks(fontsize=14) plt.subplots_adjust(top=0.919, bottom=0.111, left=0.076, right=0.899) plt.subplots_adjust(hspace=0.474, wspace=0.34) # 调整子图间距 l = 0.92 # 左边 b = 0.115 # 底部 w = 0.015 # 右 h = 0.80 # 高 # 对应 l,b,w,h;设置colorbar位置; rect = [l, b, w, h] cbar_ax = fig.add_axes(rect) plt.colorbar(norm=norm, cax=cbar_ax) # -200 -50 # https://blog.csdn.net/monotonomo/article/details/83826621 # plt.tight_layout() def formatnum(x, pos): return \'$%d$\' % (x / 1000) formatter = FuncFormatter(formatnum) ax_1.yaxis.set_major_formatter(formatter) plt.tight_layout() plt.show()
频谱图和语谱图的区别:
- A.频谱图(spectrum)来表示某一瞬间的波形图中的频率分布,而语谱图则是研究一段时间内语音的变化,特别是频率的变化
- C.频谱图表达了声压或振幅和频率的关系,一个持续的元音可有一个稳定的频谱图,最低频率峰值即为基频,而高频的峰值为谐音或泛音 (harmonics)
- D.根据滤波器的带宽可将语谱图分为两类。带宽为300Hz的宽带语谱图可以显示细致的时间结构,但谐波结构不太清楚。带宽为45Hz的窄带语谱图使时间的结构模糊,但是频率的信息较好
- E.在频谱图包络中可以有一些较宽的峰值,称为共振峰(formant);在较宽的共振峰带中可以看到个别的谐波频率
量化(Quantisation)
将连续信号近似为有限个离散值的过程。主要应用于从连续信号到数字信号的转换中。连续信号经过采样成为离散信号,离散信号经过量化就成为了数字信号。这个时候相信大家都有疑问,离散信号跟数字信号有什么区别。
离散信号和数字信号的区别
连续信号(模拟信号)经过采样成为离散信号(也称为采样信号),离散信号经过量化就成为了数字信号。
连续信号:信号连续,如正弦信;离散信号:信号不连续,只是一些离散的点,它的取值可以是无穷多种取值;
数字信号:如果是二进制量化,只有1,0两种模式的信号。四进制数字信号只有四种取值,以此类推。数字信号幅度只取几个量化的值代替区间。
增益单位dB
本意是表示两个量的比值大小。
对于功率:$dB=10*\log_{10}(\frac{A}{B})$
对于电流或者电压:$dB=20*\log_{10}(\frac{A}{B})$
A,B代表参与比较的功率值或者电流、电压值。
dB的意义就是把就是把一个很大或者很小的数比较简短地表示出来。如
| X = 100000 = $10^5$ = 10*lg(X) | dB= $10*\lg(10^5)$ dB= 50 dB |
| X = 0.000000000000001 = $10^{-15}$ | X(dB) = 10*lg(X) dB= $10*\lg(10^{-15})$ dB= -150 dB |
参考文献