【问题标题】:Can you compute the amplitude/power of original signal from Fourier transform?你能从傅里叶变换计算原始信号的幅度/功率吗?
【发布时间】:2012-11-02 23:47:21
【问题描述】:

在使用 scipy.fftpack.fft() 对一些样本进行离散傅立叶变换并绘制这些样本的幅度后,我注意到它不等于原始信号的幅度。两者之间有关系吗?

有没有一种方法可以在不反转变换的情况下根据傅里叶系数计算原始信号的幅度?

这是一个幅度为 7.0 和 fft 幅度为 3.5 的正弦波示例

from numpy import sin, linspace, pi
from pylab import plot, show, title, xlabel, ylabel, subplot
from scipy import fft, arange

def plotSpectrum(y,Fs):
 """
 Plots a Single-Sided Amplitude Spectrum of y(t)
 """
 n = len(y) # length of the signal
 k = arange(n)
 T = n/Fs
 frq = k/T # two sides frequency range
 frq = frq[range(n/2)] # one side frequency range

 Y = fft(y)/n # fft computing and normalization
 Y = Y[range(n/2)]

 plot(frq,abs(Y),'r') # plotting the spectrum
 xlabel('Freq (Hz)')
 ylabel('|Y(freq)|')

Fs = 150.0;  # sampling rate
Ts = 1.0/Fs; # sampling interval
t = arange(0,1,Ts) # time vector

ff = 5;   # frequency of the signal
y = 7.0 * sin(2*pi*ff*t)

subplot(2,1,1)
plot(t,y)
xlabel('Time')
ylabel('Amplitude')
subplot(2,1,2)
plotSpectrum(y,Fs)
show()

【问题讨论】:

  • 我会尝试math.stackexchange.com 编程部分与您的问题确实相切。
  • 你能举个例子吗?幅度不正确的原因有很多:满量程错误,忘记考虑样本数量(取决于方法),...
  • 它在代码的 cmets 中说您只绘制了频率范围的一半。这就是为什么你只能得到一半的幅度(对于任何严格的真实输入信号)。

标签: python numpy scipy signal-processing fft


【解决方案1】:

是的,Parseval's Theorem 告诉我们频域的总功率等于时域的总功率。

您可能会看到前向 FFT 中的比例因子的结果。这个比例因子的大小是一个约定问题,但最常见的是 N 的因子,其中 N 是数据点的数量。但是它也可以等于 1 或 sqrt(N)。请检查您的 FFT 文档。

还请注意,如果您仅从一半的频域 bin 中获取功率(通常在时域信号是纯实数并且您在频域中具有复共轭对称性时这样做),那么将有 2 到保重。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多