概述
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
(type, name)
设置压缩类型和描述。目前,仅支持压缩类型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)
参数:
t:array_like
评估波形的时间。
f0:float
在时间t = 0处的频率(例如Hz)。
t1:float
指定f1的时间。
f1:float
在时间t1处的波形频率(例如Hz)。
method:{‘linear’, ‘quadratic’, ‘logarithmic’, ‘hyperbolic’}, 可选参数
频率扫描的种类。如果未给出,则假定为线性。有关更多详细信息,请参见下面的注释。
phi:float, 可选参数
相位偏移,以度为单位。默认值为0。
vertex_zero:bool, 可选参数
仅当方法为‘quadratic’时才使用此参数。它确定抛物线的顶点(即频率的图表)是在t = 0还是在t = t1。
返回值:
y:ndarray
包含在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代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复