以帧为单位计算 FFT 并写入文件
calculating FFT in frames and writing to a file
我是 python 的新手,我正在尝试获取上传的 wav 文件的 FFT 值和 return 文本文件每一行中每一帧的 FFT(使用 GCP )
使用 scipy 或 librosa
我要求的帧率是30fps
波形文件将具有 48k 采样率
所以我的问题是
- 如何将整个 wav 文件的样本分成每一帧的样本
如何添加空样本使帧样本的长度为2的幂(如48000/30 = 1600添加448个空样本使其为2048)
- 如何将生成的 FFT 数组归一化为 [-1,1]?
你可以使用带有回调的 pyaudio 来实现你正在做的任何事情。
import pyaudio
import wave
import time
import struct
import sys
import numpy as np
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
def callback_test(data, frame_count, time_info, status):
frame_count =1024
elm = wf.readframes(frame_count) # read n frames
da_i = np.frombuffer(elm, dtype='<i2') # convert to little endian int pairs
da_fft = np.fft.rfft(da_i) # fast fourier transform for real values
da_ifft = np.fft.irfft(da_fft) # inverse fast fourier transform for real values
da_i = da_ifft.astype('<i2') # convert to little endian int pairs
da_m = da_i.tobytes() # convert to bytes
return (da_m, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),# sampling frequency
output=True,
stream_callback=callback_test)
# # start the stream (4)
stream.start_stream()
# # wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# # stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
请参考以下链接进一步学习:
https://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o
和
Python change pitch of wav file
我是 python 的新手,我正在尝试获取上传的 wav 文件的 FFT 值和 return 文本文件每一行中每一帧的 FFT(使用 GCP )
使用 scipy 或 librosa
我要求的帧率是30fps
波形文件将具有 48k 采样率
所以我的问题是
- 如何将整个 wav 文件的样本分成每一帧的样本
如何添加空样本使帧样本的长度为2的幂(如48000/30 = 1600添加448个空样本使其为2048)- 如何将生成的 FFT 数组归一化为 [-1,1]?
你可以使用带有回调的 pyaudio 来实现你正在做的任何事情。
import pyaudio
import wave
import time
import struct
import sys
import numpy as np
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
def callback_test(data, frame_count, time_info, status):
frame_count =1024
elm = wf.readframes(frame_count) # read n frames
da_i = np.frombuffer(elm, dtype='<i2') # convert to little endian int pairs
da_fft = np.fft.rfft(da_i) # fast fourier transform for real values
da_ifft = np.fft.irfft(da_fft) # inverse fast fourier transform for real values
da_i = da_ifft.astype('<i2') # convert to little endian int pairs
da_m = da_i.tobytes() # convert to bytes
return (da_m, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),# sampling frequency
output=True,
stream_callback=callback_test)
# # start the stream (4)
stream.start_stream()
# # wait for stream to finish (5)
while stream.is_active():
time.sleep(0.1)
# # stop stream (6)
stream.stop_stream()
stream.close()
wf.close()
# close PyAudio (7)
p.terminate()
请参考以下链接进一步学习:
https://people.csail.mit.edu/hubert/pyaudio/docs/#example-callback-mode-audio-i-o 和 Python change pitch of wav file