Python的频率分析和对数频谱

Python 频率分析和对数频谱

源代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "errrolyan"
# Date: 19-02-12
# Describe = "乐谱xml文件转化未为拼音”
import wave
import pyaudio
import numpy
import pylab

#打开WAV文档,文件路径根据需要做修改
wf = wave.open("./wav/1弦0品+2弦0品.wav", "rb")
#创建PyAudio对象
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)
nframes = wf.getnframes()
framerate = wf.getframerate()
#读取完整的帧数据到str_data中,这是一个string类型的数据
str_data = wf.readframes(nframes)
wf.close()
#将波形数据转换为数组

wave_data = numpy.fromstring(str_data, dtype=numpy.short)
print(wave_data)
#将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。
wave_data.shape = -1,2
#将数组转置
wave_data = wave_data.T

N=44100
start=0 #开始采样位置
df = framerate/(N-1) # 分辨率
freq = [df*n for n in range(0,N)] #N个元素
wave_data2=wave_data[0][start:start+N]
c=numpy.fft.fft(wave_data2)*2/N
#常规显示采样频率一半的频谱
d=int(len(c)/2)
#仅显示频率在4000以下的频谱
while freq[d]>4000:
    d-=10
pylab.plot(freq[:d-1],abs(c[:d-1]),'r')
pylab.show()

图象

Python的频率分析和对数频谱_第1张图片

对数频谱源代码

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "errrolyan"
# Date: 19-02-12
# Describe = "乐谱xml文件转化未为拼音”
import wave
import pyaudio
import numpy
import pylab
import math

#打开WAV文档,文件路径根据需要做修改
wf = wave.open("./wav/1弦0品+2弦0品.wav", "rb")

#创建PyAudio对象
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)
nframes = wf.getnframes()
framerate = wf.getframerate()

#读取完整的帧数据到str_data中,这是一个string类型的数据
str_data = wf.readframes(nframes)
wf.close()

#将波形数据转换为数组
wave_data = numpy.fromstring(str_data, dtype=numpy.short)
#print(wave_data)

#将wave_data数组改为2列,行数自动匹配。在修改shape的属性时,需使得数组的总长度不变。
wave_data.shape = -1,2

#将数组转置
wave_data = wave_data.T

N=44100
start=0 #开始采样位置
df = framerate/(N-1) # 分辨率
freq = [df*n for n in range(0,N)] #N个元素
wave_data2=wave_data[0][start:start+N]
c=numpy.fft.fft(wave_data2)*2/N
for i in range(2000):
    x=c[numpy.where(abs(c[i])>300)]
    print(round(freq[i]),round(2*10*math.log(abs(c[i]),10)))

#常规显示采样频率一半的频谱
d=int(len(c)/2)
print (d)

#仅显示频率在4000以下的频谱
while freq[d]>4000:
    d-=10

pylab.plot(freq[:d-1],2*10*numpy.log10(abs(c[:d-1])),'r')
pylab.show()

对数频谱图象

Python的频率分析和对数频谱_第2张图片

你可能感兴趣的:(python小工具编写)