簡體   English   中英

繪制和提取 fft 相位

[英]Plotting and extracting fft phase

這是一個將 fft 相位繪圖與 2 種不同方法進行比較的代碼:

import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

phase = np.pi / 4
f = 1
fs = f*20
dur=10
t = np.linspace(0, dur, num=fs*dur, endpoint=False)
y = np.cos(2 * np.pi * t + phase)
Y = scipy.fftpack.fftshift(scipy.fftpack.fft(y))
f = scipy.fftpack.fftshift(scipy.fftpack.fftfreq(len(t)))

p = np.angle(Y)
p[np.abs(Y) < 1] = 0

fig, ax = plt.subplots(2, 1)
ax[0].plot(t, y)
ax[1].plot(f*fs, p, label='from fft')
ax[1].phase_spectrum(y, fs, window=None, label='from phase_spectrum')
plt.legend()
plt.show()

結果如下:

在此處輸入圖片說明

這是當周期的信號數不是整數時的結果:

在此處輸入圖片說明

我有幾個問題:

  • 為什么相位圖與 phase_spectrum 或使用 fft 和角度如此不同? 使用 fft 然后 np.angle 會產生很好的結果,但是我們如何解釋magnitude_spectrum結果呢?
  • 在這里,我們處於一個非常簡單的情況,其中我們有 N 個周期的正弦周期信號如果我有一個寬帶信號並且我想在 f 處提取相位,我該怎么辦? 例如,這里使用示例中介紹的兩種方法,我不確定我是否可以提取精確的相位。 使用 phase_spectrum,在 f = 1 時我找不到 pi/4。 使用fft然后np.angle,為了提取好的相位,我需要確保周期的信號數是一個整數。

在回答之前,只是一個小說明:
刪除p[np.abs(Y) < 1] = 0行。 您的大部分頻譜的幅度都低於 1,這就是為什么使用這條線,您的頻譜看起來最像一條位於 0 處的平線。

現在回答:
phase_spectrum做了三件與你不同的事情:

  • 它應用相位展開。
    • 如果您想在代碼中應用相位展開,只需執行np.unwrap(np.angle(Y))
    • 如果您希望 matplotlib 在不展開的情況下繪制頻譜,請改用angle_spectrum
  • 它在計算頻譜之前對數據應用加窗函數。
    • 我知道您通過了window=None ,但是,出於某種原因,matplotlib 決定window=None表示“請使用漢寧窗口”(請參閱文檔)。
    • 如果您不希望 matplotlib 應用窗口,一種解決方案是傳遞window=lambda x: x
      • 文檔實際上建議傳遞window=matplotlib.mlab.window_none ,但它的來源只是一個def window_none(x): return x
  • 它計算頻譜的單邊版本。 文檔說只要輸入是真實的而不是復雜的,這是默認值。
    • 要獲得正常sides='twosided'版本, phase_spectrum sides='twosided' phase_spectrum sides='twosided'傳遞給phase_spectrum調用。

現在,關於以頻率f獲取相位:

為此,您必須使用相位而不展開.

如果您沒有整數個周期,您就不能直接提取單音信號的相位,這是對的。 那是因為信號的頻率並不完全落在 FFT 中任何頻率倉的頂部。 不過,您可以獲得最近 bin 相位的近似值。 您還可以對頻譜進行正弦插值,以在您想要的頻率下獲得其值。

如果您只關心單個頻率f的相位,那么您根本不應該使用 FFT。 FFT 計算所有頻率的相位和幅度。 如果您只關心單個頻率,只需執行Y_at_f = y @ np.exp(2j * np.pi * f * t)並通過np.angle(Y_at_f)獲得該相位。

您可以通過在 FFT 之前執行 fftshift(圓形旋轉 N/2)來提取參考數據窗口中心的相位。 這是因為,在 fftshift 之后,atan2() 始終與圍繞其中心的數據的奇數與偶數之比有關(分解為奇函數加偶函數)。

因此,在生成過程中計算窗口中間信號的相位,並使用它而不是開始時的相位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM