【问题标题】:Frequency domain of a sine wave with frequency 1000Hz频率为 1000Hz 的正弦波的频域
【发布时间】:2019-03-23 19:42:53
【问题描述】:

我正在 Python 上启动 DSP,但遇到了一些困难: 我正在尝试定义频率为 1000Hz 的正弦波

我尝试使用以下代码进行 FFT 并找到它的频率:

import numpy as np

import matplotlib.pyplot as plt

sampling_rate = int(10e3)
n = int(10e3)

sine_wave = [100*np.sin(2 * np.pi * 1000 * x/sampling_rate) for x in range(0, n)]

s = np.array(sine_wave)

print(s)

plt.plot(s[:200])
plt.show()

s_fft = np.fft.fft(s)
frequencies = np.abs(s_fft)
plt.plot(frequencies)
plt.show()

所以第一个情节对我来说很有意义。 第二个图 (FFT) 显示了两个频率: i) 1000Hz,这是我在开始时设置的 ii) 9000Hz,出乎意料 freqeuncy domain

【问题讨论】:

  • 对不起,我误解了部分问题。我会删除那条评论。
  • 您的采样率为 10000,因此 Nyquist frequency 为 5000。这是离散样本中可能出现的最高频率。你所说的9000赫兹实际上是-1000赫兹。您可以使用numpy.fft.fftfreq 查找与numpy.fft.fft 返回的傅立叶系数相关的频率,例如numpy.fft.fftfreq(len(s_fft), d=1/sampling_rate).

标签: python numpy signal-processing


【解决方案1】:

您的数据不尊重Shannon criterion。您没有设置正确的频率轴。

当信号是真实的时,使用 rfft 而不是 fft 也更容易。

您的代码可以修改如下:

import numpy as np
import matplotlib.pyplot as plt

sampling_rate = 10000
n = 10000
signal_freq = 4000 # must be < sampling_rate/2 
amplitude = 100

t=np.arange(0,n/sampling_rate,1/sampling_rate)
sine_wave = amplitude*np.sin(2 * np.pi *signal_freq*t) 
plt.subplot(211)
plt.plot(t[:30],sine_wave[:30],'ro')

spectrum = 2/n*np.abs(np.fft.rfft(sine_wave))
frequencies = np.fft.rfftfreq(n,1/sampling_rate)
plt.subplot(212)
plt.plot(frequencies,spectrum)
plt.show()

输出:

没有信息丢失,即使人眼可能会被时间表示所困扰。

【讨论】:

  • 是的,我现在知道我应该将频率轴限制为采样率的一半。并感谢额外的代码,它工作得很好。
猜你喜欢
  • 2015-12-16
  • 2023-04-06
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多