音频频谱的导出

  • 展示需要导出音乐中节奏
  • 个人对节奏的理解就是频谱


    声音中的频谱
  • 怎样让转换到电机上?
    • 频谱的高低直接映射为电机的角度
    • 将旋转转换为直线运动
  • 按时间导出声音谱
import wave
import pyaudio
import numpy

import matplotlib.pylab as pylab

import math

wf = wave.open("E:/trash/93s.wav", "rb")

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 = wf.readframes(nframes)
wf.close()

print( nframes, framerate, len(str_data) )

# A new 1-D array initialized from raw binary or text data in a string.
wave_data = numpy.fromstring(str_data, dtype=numpy.short)

wave_data.shape = -1,2

print( numpy.shape( wave_data ) )

wave_data = wave_data.T

print( numpy.shape( wave_data ) )

# N=44100
# start=0 
# df = framerate/(N-1)
# freq = [df*n for n in range(0,N)] 
# wave_data2=wave_data[0][start:start+N]
# c=numpy.fft.fft(wave_data2)*2/N

# d=int(len(c)/2)

# while freq[d]>4000:
#     d-=10
# pylab.plot(freq[:d-1],abs(c[:d-1]),'r')
# pylab.show()

N=44100
start=0 
df = framerate/(N-1)
freq = [df*n for n in range(0,N)] 

outFile = open("a.csv","w")
outFile.writelines( "time(s),16hz,32hz,64hz,128hz,256hz,512hz,1024hz,2048hz,4096hz,8192hz,16384hz\n")
dataLen = N/2
for i in range( 0, 93*2 ):
# for i in range( 1 ):
    # wave_data2=wave_data[0][start:start+N]
    # print( i )
    wave_data2=wave_data[0][ i * dataLen : (i+1)*dataLen ]
    c=numpy.fft.fft(wave_data2)*2/dataLen

    # d=int(len(c)/2)

    # print( i, abs(c[16]), abs(c[32]), abs(c[64]), abs(c[128]), 
    #           abs(c[256]), abs(c[512]), abs(c[1024]), abs(c[2048]),
    #           abs(c[4096]), abs(c[8192]), abs(c[16384]) ) 

    outFile.writelines( "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n" %
                         (i*0.5, math.log10(abs(c[16])), math.log10(abs(c[32])), math.log10(abs(c[64])), math.log10(abs(c[128])), 
              math.log10(abs(c[256])), math.log10(abs(c[512])), math.log10(abs(c[1024])), math.log10(abs(c[2048])),
              math.log10(abs(c[4096])), math.log10(abs(c[8192])), math.log10(abs(c[16384]))  ) )
outFile.close()    
  • 导出的各个频点


    频谱时间分布
  • 将谱线转换为电机角度用于电机转动
    rhythm

    非人类能理解
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容