博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入解构magnitude_spectrum()
阅读量:5019 次
发布时间:2019-06-12

本文共 2248 字,大约阅读时间需要 7 分钟。

深入解构magnitude_spectrum()

二话不说,现附上官方文档链接

magnitude_spectrum(self, x, Fs=None, Fc=None, window=None, pad_to=None, sides=None, scale=None, *, data=None, **kwargs)

作用:绘制幅度谱

功能:根据x计算幅度谱值,可由pad_to参数指定补零长度,指定截断采用的窗函数

参数:

x: 一维实数或复数向量或序列

Fs:标量值,采样率,默认是2

window:窗函数,默认汉宁窗

sides:枚举值,{'default', 'onesided', 'twosided'},实数数据默认单边,复数默认双边

pad_to:整数,补零个数,增加频谱密度

scale: 枚举值,{'default', 'linear', 'dB'},默认linear,而dB amplitude 算法(20 * log10)

Fc:中心频率

返回值:

spectrum: 频谱值,纵坐标

freqs:频率值,横坐标

以下进行数据读取及处理

def load_data():    # 加载从USRP采样的IQ信号,load 1024 IQdata    IQdata = np.fromfile('usrp_data_with_telosb.dat',dtype="float32",count=1024*2)    # merge these data into complex form    IQcomplex = map(complex,IQdata[0::2],IQdata[1::2])    # change these data into complex type    IQcomplex = np.array(list(IQcomplex),dtype=complex)    return IQcomplex

三种方法逐步解析

# 法一:暴力调包plt.magnitude_spectrum(IQcomplex,Fs=10,Fc=2435,sides='twosided',scale='dB')
# 法二:采用mlab调包fft_size = 1024spec, freqs = mlab.magnitude_spectrum(IQcomplex[0:fft_size)], Fs=10, sides='twosided')Fc = 2435freqs += Fc Z = 20.*np.log10(spec)plt.plot(freqs,Z)
# 法三:用numpy解决,从底层FFT看起def cal_mag(IQcomplex,fft_size=1024):#     fft_size = 1024    IQcomplex_1024 = np.asarray(IQcomplex[0:fft_size])    # 加窗,不然频谱现象不明显    result, windowVal = mlab.apply_window(IQcomplex_1024,window=mlab.window_hanning,axis=0,return_window=True)    # 进行fft    result = np.fft.fft(result, n=fft_size)    # 参数1:FFT点数,参数2:采样周期,即1/采样频率    freqs = np.fft.fftfreq(fft_size, 0.1)        # 以下代码的作用貌似是调整双边的位置    freqcenter = fft_size//2    freqs = np.concatenate((freqs[freqcenter:],freqs[:freqcenter]))    result = np.concatenate((result[freqcenter:],result[:freqcenter]),0)        # 貌似是归一化    result = np.abs(result)/np.abs(windowVal).sum()    # 加上中心频率    Fc = 2435    freqs += Fc     # 取对数坐标    spec = 20.*np.log10(result)    return spec,freqsIQcomplex = load_data()mag, freqs = cal_mag(IQcomplex)plt.plot(freqs,mag)

USRP采样所得的IQ值作频谱图如下:

img

IQcomplex = load_data()plt.figure(figsize=(6,10))num = 20for n in range(10):    plt.subplot(5,2,n+1)    IQcomplex_tmp = IQcomplex[(n+num)*1024:(n+1+num)*1024]    mag, freqs = cal_mag(IQcomplex_tmp)    plt.plot(freqs,mag)#     plt.title('{}'%n)

img

转载于:https://www.cnblogs.com/WindyZ/p/magnitude_spectrum.html

你可能感兴趣的文章
(转)Spring boot——logback.xml 配置详解(四)<filter>
查看>>
项目中操作redis改brpop阻塞模式为订阅模式的实现-java实习笔记二
查看>>
PHP中各种Hash算法性能比较
查看>>
对象深度克隆
查看>>
12动态规划运用实例
查看>>
规则9 减少DNS查找
查看>>
web 富文本编辑器总结
查看>>
限制某个进程只能在某个CPU上运行
查看>>
宋体、实例-Java中的单例模式-by小雨
查看>>
AutoMapper转换规则
查看>>
linux内核分析系列--百度
查看>>
SDN:软件定义网络
查看>>
GitHub具体教程
查看>>
写时拷贝(Copy On Write)方案详解
查看>>
CentOS 從 PHP 5.1.X 升級到 PHP 5.3
查看>>
flutter key
查看>>
iOS 开发常见函数
查看>>
Android: NDK编程入门笔记
查看>>
深刻理解Linux进程间通信(IPC)
查看>>
windows 7中添加新硬件的两种方法(本地回环网卡)
查看>>