如果有些的不对的地方, 还请大家补充:
需求:通过pcm音频来筛选是不是电话未接通音“嘟--”。
PCM概念:
Pulse-code modulation (PCM) 是用 数字代表采样后的模拟信号的一种方法,它是计算机中数字音频的标准形式。
PCM 流有两个基本属性 去决定 是不是对原始模拟信号有保真度,采样率(每秒采样多少次),位深(决定用来代表采样的量化等级,在一定程度,越大越精确) 。
我们工作中接触到的PCM, 采样率一般是8000和16000,位深一般是8bit或者16bit , 一般用16bit, 比较精确。
8bit= 2^3 (256) 一般用于电话通信。
16bit=2^16 (65536 ) 一般16bit够用,用于电脑等音频软件。
信息准备:
本来准备放一条 PCM的音频, 但是不知道怎么上传。。。
观察”嘟“声音频的声音分贝图和频谱图,就会发现,不管是分贝和频谱,电话忙音的 “嘟”声很整齐,所以我是按照频谱去计算的, 它大概分布在400+HZ的位置, 就可以通过傅里叶去计算。
脚本:
sample rate=8000 (每秒8000采样点,每毫秒8个采样点)
framelength=25ms (每帧200个采样点)
frameshift=15ms (每帧重叠80个采样点)
fftnum=256 (傅里叶变换值为256, 一般为2^N)
读取pcm:
按照帧长25ms,帧移15ms, 最后一帧不够,补零。
归一化:
加hamming窗 ###最后直接用了numpy自带的汉明窗,这是基本实现###:
FFT,这一步比较重要:
fft 对称,求模,做归一化,取最大值,获取索引:
相关知识补充:
- FFT
Numpy的fft 与rfft 对比
经过 Numpy.fft.fft 计算出来是 256个值。
经过 Numpy.fft.rfft 计算出来是 129个值.
采样频率为Fs,信号频率F,采样点数为N,某点n所表示的频率为:Fn=(n-1)*Fs
FFT 计算后的第一个值为直流分量,0HZ,整个fft计算后向量。
关于 9.08298730e-01 +0.00000000e+00j 模值镜像对称:
- DFT
- 汉明窗
典型的窗口大小是25ms,帧移是15ms。加汉明窗的函数如下,一般情况下,α取0.46 。
W(n,α ) = (1 -α ) - α cos(2*PI*n/(N-1)),0≦n≦N-1
因为汉明窗的幅频特性是旁瓣衰减较大,主瓣峰值与第一个旁瓣峰值衰减可达40db。
计算完窗函数后,跟信号相乘:Y[n]=w[n]*s[n]
参考链接:
https://en.wikipedia.org/wiki/Pulse-code_modulation
https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.fft.rfft.html
http://www.ilovematlab.cn/thread-119939-1-1.html
https://blog.csdn.net/iloveyoumj/article/details/53308142
https://www.cnblogs.com/lxy2017/p/4049124.html