gpt4 book ai didi

python - 具有意外结果的正弦波的傅里叶变换

转载 作者:行者123 更新时间:2023-11-28 17:28:45 26 4
gpt4 key购买 nike

我正在绘制正弦波(左列)及其各自的频域表示(右列):

  • 第一个波(振幅:10;频率:0.5)的 fft 表示有些困惑
  • 第二波(振幅:15;频率:5.0)看起来完全符合预期。
  • 第三波只是第一波和第二波问题的总结和继承

第二个频率图在 x=5(频率)、y=15(振幅)处恰好有一个峰值。

当只有一个频率时,为什么第一个频率图有多个峰值?

enter image description here

import numpy as np
import matplotlib.pyplot as plt

def sine(freq, time_interval, rate, amp=1):
w = 2. * np.pi * freq
t = np.linspace(0, time_interval, time_interval*rate)
y = amp*np.sin(w * t)
return y

def buildData():
secs = 3
Fs = 44100
# frequency, duration, sampling rate, amplitude
y1 = sine(0.5, secs, Fs, 10)
y2 = sine(5, secs, Fs, 15)
y3 = y1 + y2
signals = [y1, y2, y3]
showSignals(signals, Fs, secs)

def showSignals(signals, fs, secs):
nrSigs = len(signals)
fig = plt.figure()
fig.subplots_adjust(hspace=.5)
for i in range(len(signals)):
cols=2
pltIdc = []
for col in range(1,cols+1):
pltIdc.append(i*cols+col)
s = signals[i]
t = np.arange(0, secs, 1.0/fs)
ax1 = plt.subplot(nrSigs, cols, pltIdc[0])
ax1.set_title('signal')
ax1.set_xlabel('time')
ax1.set_ylabel('amplitude')
ax1.plot(t, s)

amps = 2*abs(np.fft.fft(s))/len(s) # scaled power spectrum
amps = amps[0:len(amps)/2] # because of the symmetry
amps = amps[0:50] # only the first 50 frequencies, arbitrarily chosen
# this should be close to the amplitude:
print 'magnitude of amplitudes: ' + str(sum(amps*amps)**0.5)
freqs=np.arange(0, len(amps), 1)/secs
ax2 = plt.subplot(nrSigs, cols, pltIdc[1])
ax2.grid(True)
ax2.set_title(r"$\frac{2 \cdot fft(s)}{len(s)}$")
ax2.set_xlabel('freq')
ax2.set_ylabel('amplitude')
ax2.stem(freqs, amps)
plt.show()

buildData()

最佳答案

FFT 例程执行(快速实现)离散傅立叶变换,将时间序列信号分解为由傅立叶“单位根”组成的 N 长度正交基。

当且仅当您输入的信号是傅立叶基函数之一(或其相位旋转版本)时,您将获得 FFT 输出的离散单一值,因为它将具有非零内积具有一个且只有一个基组成员(根据定义)。

您的第一个示例在分析窗口内有 1.5 个循环,因此它不能是单位根(傅里叶基函数的一个属性是它们在分析窗口内具有整数循环计数)。因此,存在非零“DC 偏移”(分析窗口上的平均值不完全为零),这将始终产生“DC”项(对应于 DC 偏移的索引 0 处的非零傅里叶贡献)。因为它是分析窗口内的非整数周期计数,所以除了来自最接近正弦波频率的频率的主要贡献之外,您还可以从 FFT 中获得其他频率的贡献。这符合预期 - 任何本身不是傅立叶基函数的正弦波都将具有非零内积和多个傅立叶基函数(因此 FFT 输出中的多个频谱贡献)。

您的第三个示例只是另外两个示例的总和,因此根据傅里叶变换的线性度,FFT 的输出只是两个单独信号的 FFT 的总和。这也是预期的:FFT(a+b) = FFT(a) + FFT(b)。

关于python - 具有意外结果的正弦波的傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com