python生成任意频率正弦波方式

如下所示:

def signal_xHz(A, fi, time_s, sample):

return A * np.sin(np.linspace(0, fi * time_s * 2 * np.pi , sample* time_s))

A:为信号幅值

fi:为信号频率

time_s:为时间长度(s)

sample:为信号采样频率

补充拓展:Python FFT合成波形实例

使用Python numpy模块带的FFT函数合成矩形波和方波,增加对离散傅里叶变换的理解。

导入模块

import numpy as np
import matplotlib.pyplot as plt
分别是产生一个周期的方波和三角波程序

# 产生size点取样的三角波,其周期为1
def triangle_wave(size):
  x = np.arange(0, 1, 1.0/size)
  y = np.where(x<0.5, x, 0)
  y = np.where(x>=0.5, 1-x, y)
  return x, y

def square_wave(size):
  x = np.arange(0, 1, 1.0/size)
  y = np.where(x<0.5, 1.0, 0)
  return x, y

其中np.where函数第二个值是if,第三个是else

下面程序可以计算对应的频谱,采样点数取为2的n次幂是为了便于FFT计算

fft_size = 256

# 计算三角波和其FFT
x, y = triangle_wave(fft_size)
fy = np.fft.fft(y) / fft_size

下面对计算的频谱进行可视化,频率对应的强度使用工程上常用的分贝dp来表示

# 绘制三角波的FFT的前20项的振幅,由于不含下标为偶数的值均为0, 因此取
# log之后无穷小,无法绘图,用np.clip函数设置数组值的上下限,保证绘图正确
plt.figure()
plt.plot(np.clip(20*np.log10(np.abs(fy[:20])), -120, 120), "o")
plt.xlabel("frequency bin")
plt.ylabel("power(dB)")
plt.title("FFT result of triangle wave")

下面用正弦和余弦函数合成信号

# 取FFT计算的结果freqs中的前n项进行合成,返回合成结果,计算loops个周期的波形
def fft_combine(freqs, n, loops=1):
  length = len(freqs) * loops
  data = np.zeros(length)
  index = loops * np.arange(0, length, 1.0) / length * (2 * np.pi)
  for k, p in enumerate(freqs[:n]):
    if k != 0: p *= 2 # 除去直流成分之外,其余的系数都*2
    data += np.real(p) * np.cos(k*index) # 余弦成分的系数为实数部
    data -= np.imag(p) * np.sin(k*index) # 正弦成分的系数为负的虚数部
  return index, data

其中index代表频谱空间的采样点

画出合成信号,x坐标使用默认的整数表示即可

# 绘制原始的三角波和用正弦波逐级合成的结果,使用取样点为x轴坐标
plt.figure()
plt.plot(y, label="original triangle", linewidth=2)
for i in [0,1,3,5,7,9]:
  index, data = fft_combine(fy, i+1, 2) # 计算两个周期的合成波形
  plt.plot(data, label = "N=%s" % i)
plt.legend()
plt.title("partial Fourier series of triangle wave")
plt.show()

以上这篇python生成任意频率正弦波方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python 实现输入任意多个数,并计算其平均值的例子

    学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的数据转存入另一个空列表(lst)中,转存时将字符串转化为整型,从而利用函数求出lst中数的和.平均值,是Python基础(5)中结尾程序的升级版. 代码如下: print("-----求平均值,可输入任意多个数-------") lst = [] #定义一个空列表 str = raw_in

  • python ffmpeg任意提取视频帧的方法

     环境准备 1.安装 FFmpeg 音/视频工具 FFmpeg 简易安装文档 2.安装 ffmpeg-python pip3 install ffmpeg-python 3.[可选]安装 opencv-python pip3 install opencv-python 4.[可选]安装 numpy pip3 install numpy 视频帧提取 准备视频素材 抖音视频素材下载:https://anoyi.com/dy/top 基于视频帧数提取任意一帧 import ffmpeg import

  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    第一种是进行多项式拟合,数学上可以证明,任意函数都可以表示为多项式形式.具体示例如下. ###拟合年龄 import numpy as np import matplotlib.pyplot as plt #定义x.y散点坐标 x = [10,20,30,40,50,60,70,80] x = np.array(x) print('x is :\n',x) num = [174,236,305,334,349,351,342,323] y = np.array(num) print('y is

  • python生成任意频率正弦波方式

    如下所示: def signal_xHz(A, fi, time_s, sample): return A * np.sin(np.linspace(0, fi * time_s * 2 * np.pi , sample* time_s)) A:为信号幅值 fi:为信号频率 time_s:为时间长度(s) sample:为信号采样频率 补充拓展:Python FFT合成波形实例 使用Python numpy模块带的FFT函数合成矩形波和方波,增加对离散傅里叶变换的理解. 导入模块 import

  • python 生成任意形状的凸包图代码

    一.效果图: 在左图的白色区域周围,画任意形状的凸包图. 二.代码 import cv2 import numpy as np def generate_poly(image, n, area_thresh): """ 随机生成凸包 :param image: 二值图 :param n: 顶点个数 :param area_thresh: 删除小于此面积阈值的凸包 :return: 凸包图 """ row, col = np.where(image

  • Python生成任意波形并存为txt的实现

    目录 一. 脚本功能 二. 使用效果 三. 代码分享 一. 脚本功能 根据采样点数,采样周期数等参数以及波形的数学表达式,生成任意波形 将波形数据转为指定位宽的二进制补码,然后存为txt 绘制原始波形和转换为二进制补码后的波形,验证转换是否正确 二. 使用效果 三. 代码分享 ''' Author : Xu Dakang Email : XudaKang_up@qq.com Date : 2021-11-19 19:12:31 LastEditors : Xu Dakang LastEditTi

  • Python生成任意范围任意精度的随机数方法

    实例如下所示: # -*- coding: utf-8 -*- import numpy as np random = np.random.RandomState(0)#RandomState生成随机数种子 for i in range(200):#随机数个数 a = random.uniform(-0.1, 0.1)#随机数范围 print round(a, 2)#随机数精度要求 以上这篇Python生成任意范围任意精度的随机数方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大

  • 利用Python批量生成任意尺寸的图片

    实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- import threading from PIL import Image image_size = range(1, 1001) def start(): for size in image_size: t = threading.Thread(target=create_image, args=(s

  • python时间序列按频率生成日期的方法

    有时候我们的数据是按某个频率收集的,比如每日.每月.每15分钟,那么我们怎么产生对应频率的索引呢?pandas中的date_range可用于生成指定长度的DatetimeIndex. 我们先看一下怎么生成日期范围:pd.date_range(startdate,enddate) 1.生成指定开始日期和结束日期的时间范围: In:import pandas as pd index = pd.date_range('4/1/2019','5/1/2019') print(index) Out: Da

  • python cv2读取rtsp实时码流按时生成连续视频文件方式

    我就废话不多说了,直接上代码吧! # coding: utf-8 import datetime import cv2 import os ip = '192.168.3.160'.replace(".", "_") rtsp = 'rtsp://admin:admin@192.168.3.160:554/1/1' # 初始化摄像头 cap = cv2.VideoCapture(rtsp) fourcc = cv2.VideoWriter_fourcc(*'XVID

  • Python实现随机生成任意数量车牌号

    之前做课设的时候舍友遇到了需要生成500w量级车牌号的问题,于是我便写了一个随机生成车牌号的程序,希望各位采纳. 注:Python实现 import random def chepaihao(len=6): char0='京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽赣粤青藏川宁琼' char1='ABCDEFGHJKLMNPQRSTUVWXYZ'#车牌号中没有I和O,可自行百度 char2='1234567890' len0=len(char0)-1 len1 = len(char1) -

  • python生成并处理uuid的实现方式

    UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来作为主键,原理上它是可以对任何东西进行唯一的编码的. 作为新手一看到类似varchar(40)这样的主键就觉得有点蒙圈了,字符串型也不能自增啊,这里就应该应用UUID了. 数据库一般都有自己的办法生成UUID,但虽然可以用,但这玩意考虑到可读性和有点坑的长度还是尽量不要用这玩意做主键···咳,有点跑题··· 下面就简单说明一下python是如何生成UUID的

  • Python生成可执行文件之PyInstaller库的使用方式

    目录 概述: 安装: 使用方式: 另一方案: 附:常用参数的使用方法如下 总结 概述: 可以将.py源代码转换成无需源代码的可执行文件(直接就可以运行的程序) 因为有的时候Windows,Mac,Linux系统上并没有安装Python的IDLE或者Python的解释器,我们需要将源程序首先编译或者打包成一个直接可以执行的程序. 安装: PyInstaller库是第三方库,使用前需要额外安装. 打开Windows平台下的command命令行,输入pip install pyinstaller pi

随机推荐