如何获取信号的相位FFT?-- 我能在时域中得到相位吗?

5

我可以获取来自.wav文件的信号幅度,但如何同时获取该信号的相位呢?以下是我浏览.wav文件并提取信号的代码:

def browse_wav(self):

    filepath = QtGui.QFileDialog.getOpenFileName(self, 'Single File', "C:\Users\Hanna Nabil\Documents",'*.wav')
    f= str(filepath)
    if f != "":
        spf = wave.open(f, 'r')
    import contextlib

    with contextlib.closing(wave.open(f, 'r')) as f:
        frames = f.getnframes()
        rate = f.getframerate()
        duration = frames / float(rate)
        print "Duration is " , duration

    # Extract Raw Audio from Wav File
    self.signal = spf.readframes(-1)
    self.signal = np.fromstring(self.signal, 'Int16')
    self.fs = spf.getframerate()
    print "Sampling Rate is " ,self.fs

    # If Stereo
    if spf.getnchannels() == 2:
        print 'Just mono files'
        sys.exit(0)

    #self.time = np.linspace(0, len(self.signal) / fs, num=len(self.signal))
    self.time = np.linspace(0, duration, self.fs * duration)

    self.xfourier = fftfreq(self.signal.size, d=self.time[1] - self.time[0])
    self.yfourier = np.abs(fft(self.signal))  # signal magnitude

    self.zico = self.yfourier
    self.cut_signal = ifft(self.zico)
2个回答

11

复杂频谱包含幅度和相位。通过计算绝对值可以得到幅度,通过计算角度可以得到相位。您可以使用numpy.angle()来获取相位:

spectrum = fft(self.signal)
magnitude = np.abs(spectrum)
phase = np.angle(spectrum)

-1
根据Lukas Lalinsky的回答,我发现不知何故需要加上π/2才能得到正确的答案。
另外还有关于点的问题:
N = len(t)
Amplitude = 2/N *  np.abs(magnitude)

你不应该加上 pi/2。这很可能源于一个误解。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接