【发布时间】:2019-07-26 18:44:28
【问题描述】:
我尝试为 aiff 文件创建低通滤波器,但发出的声音是白噪声。我只了解 FFT 如何工作的广泛概述,所以我猜我的问题与此有关。
基本上,我打开音频文件(比如钢琴循环),将其转换为单声道,然后对样本执行 FFT,然后我尝试通过将其设置为零来去除高频。最后我执行 IFTT 并将结果保存到一个新文件中。
import aifc
import struct
import numpy as np
def getMonoSamples(fileName):
enter code here`obj = aifc.open(fileName,'r')
obj.setpos(0)
numFrames = obj.getnframes()
myFrames = obj.readframes(numFrames)
samplingRate = obj.getframerate()
data = struct.unpack('{n}h'.format(n=numFrames*2), myFrames)
data = np.array(data)
dataLeft =[]
for i,x in enumerate(data):
if i%2==1:
dataLeft.append(x)
obj.close()
return dataLeft,numFrames,samplingRate
def writeMonoFile(fileName,samples,nframes):
mono_file=aifc.open(file, 'w')
comptype="NONE"
compname="not compressed"
nchannels=1
sampwidth=2
mono_file.setparams((nchannels, sampwidth, int(sampling_rate), nframes, comptype, compname))
print "writing sample aif..."
for s in samples:
mono_file.writeframes(struct.pack('h', s))
mono_file.close()
def lpFilter(dataFft):
new =[None]*len(dataFft)
for i,x in enumerate(dataFft):
#if the frequency is above 5000, remove it
if i>5000:
new[i]=0
else:
new[i]=x
return new
# get audio samples from a function that converts stereo to mono
sampleData,numFrames,samplingRate = getMonoSamples('beetP2.aif')
dataFft = np.fft.fft(sampleData)
filtered = lpFilter(dataFft)
invFft = np.fft.ifft(filtered)
invFft = [int(x) for x in invFft]
file = "test.aif"
writeMonoFile(file,invFft,numFrames)
我确实收到了一条警告:“ComplexWarning:将复数转换为实数会丢弃虚部”,但在简单地执行立体声到单声道的转换和保存时,我也会收到此警告。音频听起来不错,直到我尝试过滤它。我猜这是相关的,但不知道如何解决它。
我过滤的任何音频样本最终听起来像白噪声,而不是其自身的过滤版本。
【问题讨论】:
标签: python audio filtering fft