函数来确定正弦信号的频率

2024-10-01 17:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数字信号处理作业有问题。使用Python,我需要创建一个能够确定正弦频率的函数。我被赋予了0-4000赫兹的随机频率和Fs=8000。有人能帮忙吗?你知道吗

import numpy as np

def freqfinder(signal):
    """REPLACE"""
    x=np.fft.fft(signal)
    x=np.abs(x)
    x=np.max(x)
    return x


t=np.linspace(0,2*np.pi,8*8000)    
y=np.sin(2*t)

print(freqfinder(y))

z = np.fft.fft(y)
zz = np.abs(z)

plt.plot(zz)

我试着用这个测试fft。你知道吗


Tags: 函数importfftnumpysignalnp作业数字
1条回答
网友
1楼 · 发布于 2024-10-01 17:38:20

你的代码有了一个好的开始。需要注意的几点:

  1. 您应该只查看FFT的前半部分以获得实际输入,输出在0左右对称,您只关心大于0的频率(FFT输出的前半部分)。

  2. 你需要每一个频率的幅度,所以你应该得到fft的绝对值。

  3. 你定位的最大值不是频率,而是与频率的指数有关。它是最强频率的强度。

下面是一个演示这些想法的小脚本:

import numpy as np
import matplotlib.pyplot as plt

fs = 8000
t = np.linspace(0, 2*np.pi, fs)
freqs = [  2, 152, 423, 2423, 3541] # Frequencies to test
amps  = [0.5, 0.5, 1.0, 0.8,   0.3] # Amplitude for each freq
y = np.zeros(len(t))
for freq, amp in zip(freqs, amps):
    y += amp*np.sin(freq*t)


fig, ax = plt.subplots(1, 2)
ax = ax.flatten()
ax[0].plot(t, y)
ax[0].set_title("Original signal")

y_fft = np.fft.fft(y)           # Original FFT
y_fft = y_fft[:round(len(t)/2)] # First half ( pos freqs )
y_fft = np.abs(y_fft)           # Absolute value of magnitudes
y_fft = y_fft/max(y_fft)        # Normalized so max = 1

freq_x_axis = np.linspace(0, fs/2, len(y_fft))
ax[1].plot(freq_x_axis, y_fft, "o-")
ax[1].set_title("Frequency magnitudes")
ax[1].set_xlabel("Frequency")
ax[1].set_ylabel("Magnitude")
plt.grid()
plt.tight_layout()
plt.show()

f_loc = np.argmax(y_fft) # Finds the index of the max
f_val = freq_x_axis[f_loc] # The strongest frequency value
print(f"The strongest frequency is f = {f_val}")

输出: enter image description here

The strongest frequency is f = 423.1057764441111

您可以在右图上看到,在freqs中指定的每个频率处都有一个峰值,这是预期的。你知道吗

如果您只需要查找一个频率,那么这种设置是很好的,但否则您可能需要找到并实现一些峰值查找算法,以找到y_fft的所有频率峰值的所有索引,然后将其与freq_x_axis中的频率相关联

相关问题 更多 >

    热门问题