我正在编写一个python脚本,尝试对FFT数据的各个阶段进行操作。所以我现在要做的第一步就是让基本的东西发挥作用:
到目前为止,我已经成功地完成了第1步和第2步,所以用numpy-RFFT进行FFT是正确的,然后标准化工作也很好,所以当执行IFFT并再次播放它时,它听起来应该是正确的。然而,分离安培和相位,并把它们放在一起会引入很多噪音,所以出了问题。下面是我使用Numpy和Scipy模块的代码:
samplerate, data = wavfile.read(location)
audio = data.T[0] # first track of audio
fftData = np.fft.rfft(audio[sample:], length)
fftData = np.divide(fftData, (np.median(fftData))) #normalization with median value
phas = np.angle(fftData) #calculating the phases
amps = np.abs(fftData) #calculating the amplitudes
#here I'd do the phase manipulation
phas = np.exp(phas) #transforming phases to exponential form
amps = np.multiply(amps,phas) #multiplying the amps with the exp form of phases to get the exponential form of the complex number
output = np.fft.irfft(amps).astype(dtype=np.float32) #doing the IRFFT, I use float32 because I play it back with py audio which uses float32.
那我做错什么了?我从这里读到:https://www.intmath.com/complex-numbers/5-exponential-form.php复数可以是指数形式,所以相位和振幅可以是单独的数组。根据这个位置,数据应该是安培数(幅度)和相位指数形式的乘积。所以我有什么误解,因为它听起来真的很吵?我甚至尝试正常化后,再次加入阶段和安培,但它没有工作
你可以使用指数形式的阶段,但你必须使用复杂的指数。更具体地说,在您的例子中,
phas = np.angle(fftData0
被计算为实值角度(以弧度为单位),因此exp
的相角参数必须首先乘以1j
正确的复指数应该是:
相关问题 更多 >
编程相关推荐