频谱分析是进行信号分析的基础,这里我们采用三种简单的样本(正弦波、方波、噪声)进行频谱分析。我们用MATLAB和Python同时仿真,验证其正确性。具体操作如下:

1、用MATLAB生成一个样本并保存为WAV文件,并用MATLAB画出波形和频谱图。

2、用Python读取对应的WAV文件,并画出波形和频谱图。

1、正弦波的波形和频谱

  这里我们生成一个简单的正弦波:y=sin(2∗π∗200∗t)y=sin(2∗π∗200∗t)y = sin(2*\pi*200*t),正弦波的频率为200Hz。

1.1 基于MATLAB的波形和频谱

具体代码如下:

Df=5;     %频率间隔fs = 8000; %采样频率T = 1/fs; %采样周期N=fs/Df;    %序列点数time = (N-1)./fs; %第一个声音片段的总时长t=0:T:(N-1)./fs;y = sin(2*pi*200*t); %生成第一个声音片段。freq=0:Df:(N-1)*Df;  %计算频率段Y=fft(y,N);    %用FFT计算频谱filename = ('sinwave.wav'); %给文件取名audiowrite(filename,y,fs) %存储.wav音频文件,在这里文件名为sinwave.wavsubplot(211);plot(t,y);title('正弦波波形');subplot(212);plot(freq-fs/2,abs(fftshift(Y)));   %将零频率移动到FFT中心xlabel('频率 Hz');ylabel('幅度谱');     %并作出幅度频谱title('频谱');

实现结果如下:

1.2 基于Python的波形和频谱

import wave
import numpy as np
import pylab as plt
from scipy.fftpack import fft,ifft
#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV 文件的格式和数据。
f = wave.open(r".\sinwave.wav","rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
#样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
str_data  = f.readframes(nframes)
f.close()
#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.fromstring(str_data,dtype=np.int16)
wave_data = wave_data*1.0/(max(abs(wave_data)))#wave幅值归一化
#通过取样点数和取样频率计算出每个取样的时间。
time=np.arange(0,nframes)/framerate
# 从波形数据中取样nframes个点进行运算
xs = wave_data [:nframes]
# xf=np.fft.rfft(xs)
# #于是可以通过下面的np.linspace计算出返回值中每个下标对应的真正的频率:
# freqs=np.linspace(0,framerate/2, nframes/2+1)
xf= np.fft.fft(xs)
freqs = np.fft.fftfreq(nframes,1.0/framerate)
print(params)plt.subplot(211)
plt.plot(time[:nframes], xs)
plt.xlabel("time(s)")
plt.title('Original wave')
plt.subplot(212)
plt.plot(freqs,np.abs(xf),'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)')
plt.show()

实现结果如下:

1.3 分析

  由1.1和1.2中基于MATLAB和Python的波形及频谱图可以看出两种环境下的仿真结果相同,正弦波的波形频率为200Hz,幅值为1。频谱图中可以看出正弦波的频率在±200Hz±200Hz\pm200Hz附近。与开始假设的正弦波一致。

2、psk的波形和频谱

  这里我们先生成一个周期为0.04,幅值为1,占空比为50的方波。然后对方波进行psk调制得到psk信号。仿真分析psk信号的频谱。

2.1 基于MATLAB的波形和频谱

具体代码如下:

Df=5;     %频率间隔
fs = 8000; %采样频率
T = 1/fs; %采样周期
N=fs/Df;    %序列点数
time = (N-1)./fs; %第一个声音片段的总时长
t=0:T:time;
y=square(2*pi*25*t,50)  %产生一个周期为0.04,占空比为50%的方波。
car=sin(2*pi*100*t);   %载波
psk=y.*car;           %载波调制(相乘器)
freq=0:Df:(N-1)*Df;  %计算频率段
Y=fft(y,N);    %用FFT计算频谱
filename = ('psk.wav'); %给文件取名
audiowrite(filename,psk,fs) %存储.wav音频文件,在这里文件名为sinwave.wavsubplot(311);
plot(t,y);
axis([0 0.2 -2 2]);
title('方波波形');
subplot(312);
plot(t,psk);
axis([0 0.2 -2 2]);
title('2PSK信号');
subplot(313);
plot(freq-fs/2,abs(fftshift(Y)));   %将零频率移动到FFT中心
xlabel('频率 Hz');ylabel('幅度谱');     % 并作出幅度频谱
title('频谱');

实现结果如下:

2.2 基于Python的波形和频谱

具体代码如下:

import wave
import numpy as np
import pylab as plt
from scipy.fftpack import fft,ifft
#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV 文件的格式和数据。
f = wave.open(r".\psk.wav","rb")
#读取格式信息
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采
#样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
#读取波形数据
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)
str_data  = f.readframes(nframes)
f.close()
#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组
wave_data = np.fromstring(str_data,dtype=np.int16)
wave_data = wave_data*1.0/(max(abs(wave_data)))#wave幅值归一化
#通过取样点数和取样频率计算出每个取样的时间。
time=np.arange(0,nframes)/framerate
# 从波形数据中取样fft_size个点进行运算
xs = wave_data [:nframes]
# xf=np.fft.rfft(xs)
#于是可以通过下面的np.linspace计算出返回值中每个下标对应的真正的频率:
# freqs=np.linspace(0,framerate/2, nframes/2+1)
xf= np.fft.fft(xs)
freqs = np.fft.fftfreq(nframes,1.0/framerate)
print(params)plt.subplot(211)
plt.plot(time[:nframes], xs)
plt.xlabel("time(s)")
plt.title('Original wave')
plt.subplot(212)
plt.plot(freqs,np.abs(xf),'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)')
plt.show()

实现结果如下:

2.3 分析

  由2.1和2.2中基于MATLAB和Python的波形及频谱图可以看出两种环境下的仿真结果相同,方波的波形周期为0.25,幅值为1。对方波进行psk调制得到了正确的调相信号。

基于MATLAB和Python的频谱分析相关推荐

  1. Mel滤波器组的设计与实现(基于MATLAB和Python)

    Mel滤波器组的设计与实现(基于MATLAB和Python) 1.Mel滤波器组介绍 在语音的频谱范围内设置若干带通滤波器Hm(k),0≤m<MHm(k),0≤m<M{{H}_{m}}\l ...

  2. MFCC特征参数提取(一)(基于MATLAB和Python实现)

    1.MFCC概述 在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scale Frequency ...

  3. 非抽样小波变换 matlab,基于Matlab和Python的非采样离散小波变换

    大致基于上图: 我需要做一个这样的数组:array = [(image),(1,ll),(1,lh),(1,hl),(2,ll),(2,lh),(2,hl)] 在这里,图像是一个二维数组,其余的数组项 ...

  4. 基于MATLAB和PYTHON的跨平台光学建模与设计

    现代光学系统的建模和设计,随着复杂性的增加,可以受益于多种软件工具的结合.特别是对于优化和数据处理,一个单一的软件包往往不能在所有感兴趣的领域提供所有必要的功能.当与其他软件工具一起使用时,Virtu ...

  5. 基于MATLAB与Python的DBSCAN算法代码

    接上文,我们详细介绍了DBSCAN与几种常见聚类算法的对比与流程,DBSCAN聚类算法最为特殊,它是一种基于密度的聚类方法,聚类前不需要预先指定聚类的个数,接下来将DBSCAN分析代码分享 Pytho ...

  6. matlab散点光滑连线,科研画图:散点连接并平滑(基于Matlab和Python)

    导师要求参照别人论文中的图(下图),将其论文中的图画美观些 附上自己整合验证过的代码: 功能:将散点连接并平滑 1)Matlab 效果图: x1=[431.50032,759.5552,1335.37 ...

  7. 基于MATLAB和python输出曼德勃罗集

    上帝的指纹--曼德勃罗集 曼德勃罗集可称是人类有史以来做出的最奇异.最瑰丽的几何图形,被人称为"上帝的指纹"."魔鬼的聚合物". 这个点集均出自公式:Zn+1= ...

  8. 基于MATLAB、Python科研数据可视化

    目录 MATLAB科研数据可视化 Python科研数据可视化 MATLAB科研数据可视化 互联网的飞速发展伴随着海量信息的产生,而海量信息的背后对应的则是海量数据.如何从这些海量数据中获取有价值的信息 ...

  9. 基于matleb对音频信号的频谱分析(幅频)和滤波分析

    基于matlab对音频信号的频谱分析(幅频)和滤波分析 频谱分析 函数Spectrum.m 功能是生成单边频谱图和双边频谱图. 记得使用函数前要加 figure;% 建立窗口放频谱 以下是函数代码: ...

最新文章

  1. MySQL优化篇:数据准备
  2. 大神开源AI代码!这次我也可以亲自上手、模仿OpenAI利用文本合成图像啦!
  3. Linux下解决“shutdown: command not found“问题
  4. 如何提高Linux下块设备IO的整体性能?
  5. 企业的无线安全问题综合解决方案
  6. tomcat 4.0头文件及maven导出问题万能build模板
  7. Codeforces Round #420 E
  8. AUTOSAR从入门到精通100讲(二十)-特斯拉、高通、华为AI处理器深度分析
  9. c/c++面试试题(三)
  10. python中列表和集合的区别_python中列表和集合有什么区别
  11. 【正则表达式】正则表达式
  12. 10 -3 2用c语言怎么打,(3*20+30-10)/2怎么使用C语言编写
  13. php把文本数据保存为文件格式,word如何保存文件格式为纯文本格式?
  14. 一名 IT 工程师的九年工作总结!
  15. brew的安装以及使用
  16. 编码器控制电机正反转梯形图_PLC控制电机正反转以及其它实例
  17. 脉冲触发器和边沿触发器的区别
  18. 【C语言】数组和函数
  19. 计算机无线网怎么安装教程,安装无线网必看 给家庭安装无线宽带WIFI的详细步骤(图)...
  20. 内置计算机函数sgn,“sgn”是什么函数?

热门文章

  1. python smtp模块发送邮件
  2. 千兆宽带:是为了速度而提升速度吗?
  3. Bzoj3060 [Poi2012]Tour de Byteotia
  4. spring实例教程
  5. 【练习】OC语法的简单复习
  6. 5.数字拆分成4段,怎样使得4段的乘积最小【dp】
  7. mysql5.6安装及实现双向备份
  8. httpclient通过POST来上传文件,而不是通过流的形式,并在服务端进行解析(通过htt......
  9. 爱因斯坦谜题解答(三种算法比较)
  10. Python中numpy数组的拼接、合并