语音基础代码-----手动产生噪声和音频并显示

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

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值