从频域数据创建的声音保真度

时间:2018-08-08 08:37:07

标签: python scipy fft wav ifft

我知道可以从频域数据(幅度+相位)创建.wav文件,但是我想知道与真实(原始)声音有多近?例如,它是否取决于频率步长(或其他)?

第二个问题: 我需要编写一个采用频域数据(幅度+相位)的代码来构建wav文件。 为了做到这一点,我从下面的代码开始,它创建了一个假信号-> fft(这时,我有了目标代码所期望的输入(mag + phase))。但这似乎并不是最好的方法,请您帮忙

import numpy as np 
from scipy import pi 
import matplotlib.pyplot as plt
#%matplotlib inline
from scipy.fftpack import fft 

min=0
max=400

def calculateFFT (timeStep,micDataX,micDataY):

    n=micDataX.size

    FFT=np.fft.fft(micDataY)
    fft_amlitude=2*abs(FFT)/n
    fft_phase=np.angle(FFT)
    fft_freq= np.fft.fftfreq(n, d=timeStep) #not used created manually (7 lines) check pi_fFreqDomainCreateConstantBW it is kept here to compare sizes 
    upper_bound=int((n)/2)

    return fft_freq[1:upper_bound],fft_amlitude[1:upper_bound],fft_phase[1:upper_bound]


def calculateI_FFT (n,amplitude_spect,phase_spect):

    data=list()

    for mag,phase in zip(amplitude_spect,phase_spect):
        data.append((mag*n/2)*(np.cos(phase)+1j* np.sin(phase)))
    full_data=list(data)
    i_data=np.fft.irfft(data)
    return i_data

#sampling rate and time vector
start_time=0 #sec
end_time= 2 
sampling_rate=1000 #Hz
N=(end_time-start_time)*sampling_rate 

#Freq domain peaks
peak1_hz=60 # freq of peak 
peak1_mag= 25 

peak2_hz=270 # freq of peak 
peak2_mag= 2 

#Vibration data generation
time =np.linspace(start_time,end_time,N)
vib_data=peak1_mag*np.sin(2*pi*peak1_hz*time)+peak2_mag*np.sin(2*pi*peak2_hz*time)

#Data plotting 
plt.plot(time[min:max],vib_data[min:max])

# fft 
time_step=1/sampling_rate
fft_freq,fft_data,fft_phase=calculateFFT(time_step,time,vib_data)

#ifft 
i_data=calculateI_FFT(N,fft_data,fft_phase)

#plotting
plt.plot(time[min:max],i_data[min:max])
plt.xlabel("Time (s)")
plt.ylabel("Vibration (g)")
plt.title("Time domain")


plt.show()

已附加输出信号屏幕截图(蓝色代表原始信号,橙色代表重建的信号) enter image description here

谢谢!

0 个答案:

没有答案