我是靠谱客的博主 缥缈流沙,最近开发中收集的这篇文章主要介绍Python知识:生成声波并显示一、说明 二、读文件Wave_read Objects三、存储 Wave_write Objects¶四、signal.chirp函数五、Python代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

scipy.signal.chirp — SciPy v1.8.0 Manual

目录

1 说明 

2 读文件Wave_read Objects

3 存储 Wave_write Objects¶

4 signal.chirp函数

5、Python代码


一、说明 

        如何自己产生一个声波? 采用signal.chirp产生声波,对声波读、存、参数设定,等声波操作,都依靠一个叫Wav的对象完成。

二、读文件Wave_read Objects

Wave_read Objects对象是由open()返回,Wave_read Objects内部函数是:

  • Wave_read.close()

如果流被wave打开,请关闭它,并使实例不可用。这在对象集合中自动调用。

  • Wave_read.getnchannels()

返回音频通道数(1个用于单声道 mono,2个用于立体声 stereo)。

  • Wave_read.getsampwidth()

返回以字节为单位的样本宽度。

  • Wave_read.getframerate()

返回采样频率。

  • Wave_read.getnframes()

返回音频帧数。

  • Wave_read.getcomptype()

返回压缩类型(“无”是唯一受支持的类型,因wav格式从不压缩)。

  • Wave_read.getcompname()

压缩getcomptype()的人能读格式。通常“不压缩”平行“无”。

  • Wave_read.getparams()

返回一个属性名称的列组:(nchannels, sampwidth, framerate, nframes, comptype, compname), equivalent to output of the get*() methods.

  • Wave_read.readframes(n)

读取第n个帧的声音采样信号,以 bytes 格式读入。

  • Wave_read.rewind()

将文件指针倒回音频流的开头。

以下两种方法是为了与aifc模块兼容而定义的,不做任何有趣的事情。

  • Wave_read.getmarkers()

Returns None.

  • Wave_read.getmark(id)

Raise an error.

The following two methods define a term “position” which is compatible between them, and is otherwise implementation dependent.

Wave_read.setpos(pos)

Set the file pointer to the specified position.

Wave_read.tell()

Return current file pointer position

三、存储 Wave_write Objects¶

        对于可查找的输出流,wave头将自动更新,以反映实际写入的帧数。对于不可见流,写入第一帧数据时,nframes值必须准确。通过调用setnframes()或setparams(),在调用close()之前写入的帧数,然后使用writeframesraw()写入帧数据,或者通过调用writeframes()写入所有要写入的帧数据,可以获得准确的nframes值。在后一种情况下,writeframes()将计算数据中的帧数,并在写入帧数据之前相应地设置nframes。

  • Wave_write.close()

确保nframes是正确的,如果文件是由wave打开的,关闭该文件。此方法在对象集合中调用。如果输出流不可查找且nframes与实际写入的帧数不匹配,则会引发异常。

  • Wave_write.setnchannels(n)

设置通道

  • Wave_write.setsampwidth(n)

设置采样宽度 n bytes.

  • Wave_write.setframerate(n)

设置帧的速率. 在版本3.2中更改:此方法的非整数输入被四舍五入到最接近的整数。

  • Wave_write.setnframes(n)

将帧数设置为n。如果实际写入的帧数不同,这将在以后更改(如果输出流不可查找,则此更新尝试将引发错误)。

  • Wave_write.setcomptype(typename)

设置压缩类型和描述。目前,仅支持压缩类型NONE,这意味着不支持压缩。

  • Wave_write.setparams(tuple)

获取属性的元组,元组应该是(nchannels、sampwidth、framerate、nframes、comptype、compname),其值对set*()方法有效。设置所有参数。

  • Wave_write.tell()

返回文件中的当前位置,与Wave_read的免责声明相同。告诉()并挥手阅读。setpos()方法。

  • Wave_write.writeframesraw(data)

编写音频帧,但不更正nframes。在版本3.4中更改:现在接受任何类似对象的字节。

  • Wave_write.writeframes(data)

编写音频帧并确保nframes是正确的。如果输出流不可查找,并且写入数据后写入的帧总数与之前为nframes设置的值不匹配,则会引发错误。

Changed in version 3.4: Any bytes-like object is now accepted.

四、signal.chirp函数

函数说明:

Frequency-swept名叫余弦信号发生器。

在下文中,‘Hz’应解释为“每单位循环数”;此处不要求单位为一秒。重要的区别是旋转单位是周期,而不是弧度。同样,t可以表示空间而不是时间。

函数格式:

scipy.signal.chirp(t, f0, t1, f1, method='linear', phi=0, vertex_zero=True)

参数:

tarray_like  

评估波形的时间。

f0float

在时间t = 0处的频率(例如Hz)。

t1float

指定f1的时间。

f1float

在时间t1处的波形频率(例如Hz)。

method{‘linear’, ‘quadratic’, ‘logarithmic’, ‘hyperbolic’}, 可选参数

频率扫描的种类。如果未给出,则假定为线性。有关更多详细信息,请参见下面的注释。

phifloat, 可选参数

相位偏移,以度为单位。默认值为0。

vertex_zerobool, 可选参数

仅当方法为‘quadratic’时才使用此参数。它确定抛物线的顶点(即频率的图表)是在t = 0还是在t = t1。

返回值:

yndarray

包含在t处以请求的time-varying频率评估的信号的numpy数组。更准确地说,函数返回cos(phase + (pi/180)*phi)其中是整数(从0到t的)2*pi*f(t)f(t)在下面定义。

五、Python代码

#!usr/bin/env python
#code=utf-8

from tkinter import *
import wave
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
import sys

sys.setrecursionlimit(1000000)

#define the params of wave
channels = 1
sampwidth = 2
framerate = 9600
file_name = 'sweep.wav'
frequency_begin = 1
frequency_end = 100
#define the time of wave
time = 1

def Generate_Wav():
	#generate the time bar
	t = np.arange(0,time,1.0/framerate)
	#generate the chirp signal from 300 to 3300Hz
	wave_data = signal.chirp(t, frequency_begin, time, frequency_end, method = 'linear')*1000
	#cast to the type of short
	wave_data = wave_data.astype(np.short)
	#open a wav document
	f = wave.open(file_name,"wb")
	#set wav params
	f.setnchannels(channels)
	f.setsampwidth(sampwidth)
	f.setframerate(framerate)
	#turn the data to string
	f.writeframes(wave_data.tobytes())
	f.close()

def my_button(root,label_text,button_text,button_func):
    '''''function of creat label and button'''
    #label details
    label = Label(root)
    label['text'] = label_text
    label.pack()
    #label details
    button = Button(root)
    button['text'] = button_text
    button['command'] = button_func
    button.pack()

def read_wave_data(file_path):
    #open a wave file, and return a Wave_read object
    f = wave.open(file_path,"rb")
    #read the wave's format infomation,and return a tuple
    params = f.getparams()
    #get the info
    nchannels, sampwidth, framerate, nframes = params[:4]
    #Reads and returns nframes of audio, as a string of bytes.
    str_data = f.readframes(nframes)
    #close the stream
    f.close()
    #turn the wave's data to array
    wave_data = np.frombuffer(str_data, dtype = np.short)
    time = np.arange(0, nframes) * (1.0/framerate)
    return wave_data, time

def Plot_Wav():
	wave_data, time = read_wave_data(file_name)
	plt.plot(time, wave_data)
	plt.grid(True)
	plt.show()

def main():
	root = Tk()
	my_button(root, 'Generate a sweep wav', 'Generate', Generate_Wav)
	my_button(root, 'Plot the wav', 'Plot', Plot_Wav)
	root.mainloop()

if __name__ == "__main__":
	main()

最后

以上就是缥缈流沙为你收集整理的Python知识:生成声波并显示一、说明 二、读文件Wave_read Objects三、存储 Wave_write Objects¶四、signal.chirp函数五、Python代码的全部内容,希望文章能够帮你解决Python知识:生成声波并显示一、说明 二、读文件Wave_read Objects三、存储 Wave_write Objects¶四、signal.chirp函数五、Python代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部