import numpy as np
from matplotlib import pyplot as plt
fs = 50
t = np.arange(-5,5,step=0.1) # 从-5--5之间,每隔0.1分隔一个时间点
x = np.random.randn(100) #通过本函数可以返回一个或一组服从标准正态分布的随机样本值
# np.random.rand()本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
#这个函数是标准正态分布的均匀分布。
plt.figure()
plt.subplot(2,3,1)
plt.plot(t,x)
plt.xlabel('time/s')
plt.ylabel('amplu')
plt.title('noise wave')
plt.show()
# FFT变换做频谱图
y = np.fft.fft(x,n=100)
mag = np.abs(y)
f = np.linspace(0,len(y)-1,num=100) * fs / len(y) # 转换为频率
plt.subplot(2,3,2)
plt.plot(f,mag)
plt.xlabel('fre/hz')
plt.ylabel('amplu')
plt.title('amplitude')
plt.show()
# 求功率谱
power = np.power(mag,2)
plt.subplot(2,3,3)
plt.plot(f,power)
plt.xlabel('fre/hz')
plt.ylabel('power spec')
plt.title('power spec')
plt.show()
# 求对数谱
ln = np.log(mag)
plt.subplot(2,3,4)
plt.plot(f,ln)
plt.xlabel('fre/hz')
plt.ylabel('log')
plt.title('log spec')
plt.show()
# ifft逆变换
xifft = np.fft.ifft(y,n=100)
magx = np.real(xifft)
ti = np.linspace(0,len(xifft)-1,num=100) / fs
plt.subplot(2,3,5)
plt.plot(ti,magx)
plt.xlabel('time/s')
plt.ylabel('ampli')
plt.title('ifft')
plt.show()
上面的代码段是随机产生一个噪声的音频。分别有对应的时域波形,FFT之后的频谱等等。
下面这个同理,获得的是一段音频,不是噪音。可以看到上面的噪音是没有周期性质的。
1.用python来绘制一个语音时域波形,用正弦三角函数得到音频。
from matplotlib import pyplot as plt
import numpy as np
import matplotlib
#matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
# plt.rcParams['font.family'] = ['sans-serif'] # 设置字体样式
# plt.rcParams['font.sana-serif'] = ['SimHei']
fs = 100 # 设置采样率
N = 128 # 设置采样点
n = np.linspace(0,N-1,num=100) # 128个采样点之间,分割为100份
t = n / fs # 音频的长度除以采样率等于的就是音频的时间长度
f0 = 10 # 设置基频
# 生成正弦信号
x = np.sin(2*np.pi*f0*t)
plt.subplot(2,2,1)
plt.plot(t,x) # 画图,第一个为横坐标,第二个为纵坐标
plt.xlabel('time/s')
plt.ylabel('amplitude')
plt.title('time wave')
plt.show()
绘制出来的波形时域图如下:可以看到该波形图是一个周期序列图。横坐标为时间,纵坐标为幅值,代表声音的响度。
其余的代码如下,和噪声的都类似:
# 进行FFT变换得到频谱图
y = np.fft.fft(x,n=N) # 对X做傅里叶变换,N点变换
mag = np.abs(y)
f = np.linspace(0,len(y)-1,num=N) * fs / len(y) # 求出每个复数值对应的实际频率的大小
plt.subplot(2,3,2)
plt.plot(f,mag)
plt.xlabel('fre/hz')
plt.ylabel('ampli')
plt.title('amplitude spec')
plt.show()
# 求均方根谱
# sq = np.sqrt(y)
# plt.subplot(2,3,3) # 2行3列,共有6个小格
# plt.plot(f,sq)
# plt.xlabel('fre/hz')
# plt.ylabel('sqrt spec')
# plt.title('sqrt spec')
# plt.show()
# 功率谱
power = mag ** 2
plt.subplot(2,3,4)
plt.plot(f,power)
plt.xlabel('fre/hz')
plt.ylabel('power spec')
plt.title('power spec')
plt.show()
# 求对数谱
ln = np.log(mag)
plt.subplot(2,3,5)
plt.plot(f,ln)
plt.xlabel('fre/hz')
plt.ylabel('log spec')
plt.title('log spec')
plt.show()
#用ifft恢复信号
xifft =np.fft.ifft(y,n=N)
magx = np.real(xifft)
ti = np.linspace(0,len(xifft)-1,num=N) / fs
plt.subplot(2,3,6)
plt.plot(ti,magx)
plt.xlabel('time/s')
plt.ylabel('amplu')
plt.title('ifft')
plt.show()
2.幅度谱,横坐标频率,纵坐标是幅度
3.功率谱,横坐标是频率,纵坐标是幅度的平方
4.对数谱,对幅度谱取对数。
5.ifft