- 展示需要导出音乐中节奏
-
个人对节奏的理解就是频谱
声音中的频谱 - 怎样让转换到电机上?
- 频谱的高低直接映射为电机的角度
- 将旋转转换为直线运动
- 按时间导出声音谱
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
非人类能理解


