6

我不知道该怎么做,我得到了一个例子,例如频谱图,但这是二维的。

我这里有生成混合频率的代码,我可以在 fft 中挑选出这些,我如何在频谱图中看到这些?我很欣赏我的例子中的频率不会随着时间而改变。那么这是否意味着我会在频谱图上看到一条直线?

我的代码和输出图像:

# create a wave with 1Mhz and 0.5Mhz frequencies
dt = 2e-9
t = np.arange(0, 10e-6, dt)
y = np.cos(2 * pi * 1e6 * t) + (np.cos(2 * pi * 2e6 *t) * np.cos(2 * pi * 2e6 * t))
y *= np.hanning(len(y))
yy = np.concatenate((y, ([0] * 10 * len(y))))

# FFT of this
Fs = 1 / dt  # sampling rate, Fs = 500MHz = 1/2ns
n = len(yy)  # length of the signal
k = np.arange(n)
T = n / Fs
frq = k / T  # two sides frequency range
frq = frq[range(n / 2)]  # one side frequency range
Y = fft(yy) / n  # fft computing and normalization
Y = Y[range(n / 2)] / max(Y[range(n / 2)])

# plotting the data
subplot(3, 1, 1)
plot(t * 1e3, y, 'r')
xlabel('Time (micro seconds)')
ylabel('Amplitude')
grid()

# plotting the spectrum
subplot(3, 1, 2)
plot(frq[0:600], abs(Y[0:600]), 'k')
xlabel('Freq (Hz)')
ylabel('|Y(freq)|')
grid()

# plotting the specgram
subplot(3, 1, 3)
Pxx, freqs, bins, im = specgram(y, NFFT=512, Fs=Fs, noverlap=10)
show()

输出文件

4

3 回答 3

9

您所拥有的在技术上是正确的,但您只需要查看带有有趣频谱图的信号。为此,您需要频率随时间变化。(要做到这一点,你需要很多振荡,因为建立一个频率需要一些振荡,然后你需要其中的许多振荡以一种有趣的方式随时间变化。)

下面我尽可能少地修改了你的代码,以获得一个有趣fscale的频率(只是随着时间的推移增加频率)。我发布了所有代码以使其正常工作,但我只更改了前四行中的三行。

在此处输入图像描述

# create a wave with 1Mhz and 0.5Mhz frequencies
dt = 40e-9
t = np.arange(0, 1000e-6, dt)
fscale = t/max(t)
y = np.cos(2 * pi * 1e6 * t*fscale) + (np.cos(2 * pi * 2e6 *t*fscale) * np.cos(2 * pi * 2e6 * t*fscale))
y *= np.hanning(len(y))
yy = np.concatenate((y, ([0] * 10 * len(y))))

# FFT of this
Fs = 1 / dt  # sampling rate, Fs = 500MHz = 1/2ns
n = len(yy)  # length of the signal
k = np.arange(n)
T = n / Fs
frq = k / T  # two sides frequency range
frq = frq[range(n / 2)]  # one side frequency range
Y = fft(yy) / n  # fft computing and normalization
Y = Y[range(n / 2)] / max(Y[range(n / 2)])

# plotting the data
subplot(3, 1, 1)
plot(t * 1e3, y, 'r')
xlabel('Time (micro seconds)')
ylabel('Amplitude')
grid()

# plotting the spectrum
subplot(3, 1, 2)
plot(frq[0:600], abs(Y[0:600]), 'k')
xlabel('Freq (Hz)')
ylabel('|Y(freq)|')
grid()

# plotting the specgram
subplot(3, 1, 3)
Pxx, freqs, bins, im = specgram(y, NFFT=512, Fs=Fs, noverlap=10)
show()

另外,请注意这里只有频谱图有用。如果您可以看到良好的波形或频谱,则频谱图可能不会很有趣:1)如果波形清晰,您可能没有足够的数据和时间来确定频率并发生足够的变化以引起人们的兴趣; 2)如果完整的光谱很清晰,那么您可能没有足够的频率变化来显示光谱图,因为光谱基本上只是您在光谱图中看到的随时间变化的平均值。

如果您真的想查看原始信号的频谱图,只需放大 y 轴即可查看您期望的峰值(请注意,频谱图 y 轴为 2.5e8,必须大于您的频谱): 在此处输入图像描述

于 2013-09-27T18:37:58.023 回答
2

得到你所追求的:

1) 以高频采样 1d 波形(至少为其最高频率分量的频率的 5 倍)

2) 使用样本块(2 的幂,如 1024、16384 等)来计算 FFT

3) 为每个频谱绘制一条垂直像素线,其颜色代表每个频率的幅度。

4) 对每个样本块重复步骤 2 和 3。

在您的情况下,该图具有整个彩虹般的颜色,不应仅以几个非常不同的频率出现。您的光谱图在峰值周围有相当宽的频带,但这可能是由于采样率低且绘图平滑。

于 2013-09-27T13:59:55.793 回答
0

我刚开始使用 Python 3.6 感谢您提供 Spectrogram 示例代码!

然而,在 Python 3.6 中,我努力让这个示例频谱图代码工作(函数调用和浮点除法我已经编辑了代码,所以它现在可以在 python 3.6 上为我的 Python 新手朋友工作。

享受

'''
Original Script for Python 2.7
https://stackoverflow.com/questions/19052324/how-do-i-generate-a-spectrogram-of-a-1d-signal-in-python
Modified in August 2017 for Python 3.6
Python 2.7 two integers / Division generate Integer
Python 3.6 two integers / Division generate Float
Python 3.6 two integers // Division generate integer
'''


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


dt = 40e-9
t = np.arange(0, 1000e-6, dt)
fscale = t/max(t)
y = np.cos(2 * np.pi * 1e6 * t*fscale) + (np.cos(2 * np.pi * 2e6 *t*fscale) * np.cos(2 * np.pi * 2e6 * t*fscale))
y *= np.hanning(len(y))
yy = np.concatenate((y, ([0] * 10 * len(y))))

# FFT of this
Fs = 1 / dt  # sampling rate, Fs = 500MHz = 1/2ns
n = len(yy)  # length of the signal
k = np.arange(n)
T = n / Fs
frq = k / T  # two sides frequency range
frq = frq[range(n // 2)]  # one side frequency range
Y = fftpack.fft(yy) / n  # fft computing and normalization
Y = Y[range(n // 2)] / max(Y[range(n // 2)])

# plotting the data
plt.subplot(3, 1, 1)
plt.plot(t * 1e3, y, 'r')
plt.xlabel('Time (micro seconds)')
plt.ylabel('Amplitude')
plt.grid()

# plotting the spectrum
plt.subplot(3, 1, 2)
plt.plot(frq[0:600], abs(Y[0:600]), 'k')
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')
plt.grid()

# plotting the specgram
plt.subplot(3, 1, 3)
Pxx, freqs, bins, im = plt.specgram(y, NFFT=512, Fs=Fs, noverlap=10)
plt.show()
于 2017-08-04T13:53:32.963 回答