什么是负频率的正余弦函数
时间: 2023-12-24 19:33:33 浏览: 34
在频域分析中,我们通常将频率范围划分为正频率和负频率。正频率表示信号在某个频率上的振荡,而负频率则表示信号在相反频率上的振荡。
负频率的正余弦函数是指具有负频率的正弦和余弦函数。在傅里叶变换中,由于信号是实数信号,其频谱是对称的。因此,正频率和负频率的正余弦函数是成对出现的。
对于长度为N的输入信号,在傅里叶变换后的结果中,前N/2个复数表示正频率的正余弦函数,后N/2个复数表示负频率的正余弦函数。其中,第0个复数表示直流分量(频率为0),第1个复数表示基本频率(频率为Fs/N,其中Fs是采样率),第2个复数表示2倍基本频率,以此类推。
需要注意的是,负频率的正余弦函数与相应正频率的正余弦函数具有共轭关系。具体地说,如果一个复数表示正频率的正余弦函数,其共轭复数则表示对应负频率的正余弦函数。因此,在进行频域分析时,我们通常只关注前N/2个复数的振幅和相位,而后N/2个复数的信息可以通过共轭关系得到。
总结起来,负频率的正余弦函数是傅里叶变换结果中表示相反频率的正余弦函数,与正频率的正余弦函数具有共轭关系。
相关问题
np.fft.fft会把数据分解成几个正余弦函数?
np.fft.fft函数将输入的时域信号分解为一系列复数,每个复数表示一个正余弦函数的振幅和相位。具体来说,如果输入信号长度为N,则输出结果将包含N个复数,其中第k个复数表示频率为k的正余弦函数。
对于长度为N的输入信号,输出结果中的前N/2个复数表示正频率的正余弦函数,而后N/2个复数表示负频率的正余弦函数。其中,第0个复数表示直流分量(频率为0),第1个复数表示基本频率(频率为Fs/N,其中Fs是采样率),第2个复数表示2倍基本频率,以此类推。
需要注意的是,正余弦函数是成对出现的,对应的振幅和相位是共轭关系。因此,只需要关注输出结果中前N/2个复数的振幅和相位即可,后N/2个复数的振幅和相位可以通过共轭关系得到。
下面是一个简单的示例代码,演示如何获取正余弦函数的振幅和相位:
```python
import numpy as np
x = np.array([1, 2, 3, 4])
fft_result = np.fft.fft(x)
amplitude = np.abs(fft_result[:len(fft_result)//2])
phase = np.angle(fft_result[:len(fft_result)//2])
print("Amplitude:", amplitude)
print("Phase:", phase)
```
输出结果:
```
Amplitude: [10. 2. 2. 2.]
Phase: [ 0. 1.57079633 -3.14159265 -1.57079633]
```
这里的输出结果表示输入信号被分解成了4个正余弦函数,分别具有不同的振幅和相位。
展示正、余弦信号的抽样与重构
正弦信号的抽样与重构:
假设原始信号为 $x(t) = A\sin(2\pi f t)$,对其进行抽样,得到抽样序列 $x[n] = A\sin(2\pi f nT_s)$,其中 $T_s$ 为采样周期,$n$ 为整数。
对于正弦信号,其频谱是连续的,因此需要将其离散化,得到频谱序列 $X[k]$,其中 $k$ 为整数。根据采样定理,要保证恢复信号,需要满足 $f_s > 2f$,即采样频率应大于原始信号的最高频率分量。因此,可以选择采样频率为 $f_s = 10f$。
对于离散信号,其频谱是周期性的,且周期为采样频率。因此,可以将频谱序列 $X[k]$ 按照周期重复,得到连续的频谱函数 $X(f)$。根据采样定理,每个周期内包含了完整的频谱信息,因此只需要考虑一个周期内的频谱即可。
根据采样定理,每个周期内最多包含 $N/2$ 个频率分量,其中 $N$ 为采样点数。因此,可以选择 $N = 20$,得到频率分辨率为 $f_s/N = 0.5f$。
对于正弦信号,其频谱是对称的,因此只需要考虑正频率分量。根据傅里叶变换的定义,可以得到频谱函数 $X(f)$:
$$
X(f) = \sum_{n=0}^{N-1} x[n] e^{-j2\pi fnT_s}
= \sum_{n=0}^{N-1} A\sin(2\pi f nT_s) e^{-j2\pi fnT_s}
$$
化简上式,得到:
$$
X(f) = \frac{AN}{2j} \left[\delta(f-f_0) - \delta(f+f_0)\right]
$$
其中 $f_0 = \frac{f_s}{N}$ 为正频率分辨率,$\delta(f)$ 表示单位冲激函数。因此,可以得到频谱函数 $X(f)$ 如下图所示:
![image.png](attachment:image.png)
根据采样定理,可以通过插值恢复原始信号。由于正弦信号的频谱是对称的,因此只需要恢复正频率分量。根据插值定理,可以使用最近邻插值或线性插值进行恢复。这里使用线性插值进行恢复。
对于线性插值,假设重构信号为 $y(t)$,则有:
$$
y(t) = \sum_{n=-\infty}^{\infty} y[n] \text{sinc}(\frac{t-nT_s}{T_s})
$$
其中 $\text{sinc}(x) = \frac{\sin(\pi x)}{\pi x}$ 表示采样函数。将采样序列 $x[n]$ 代入上式,得到:
$$
y(t) = \sum_{n=-\infty}^{\infty} A\sin(2\pi f nT_s) \text{sinc}(\frac{t-nT_s}{T_s})
$$
化简上式,得到:
$$
y(t) = A\sum_{n=-\infty}^{\infty} \frac{\sin[2\pi f (t-nT_s)]}{2\pi f (t-nT_s)}
$$
因此,可以通过上式进行重构。下面是使用线性插值重构正弦信号的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 原始信号参数
A = 1 # 振幅
f = 1 # 频率
# 采样参数
fs = 10 * f # 采样频率
Ts = 1 / fs # 采样周期
N = 20 # 采样点数
# 生成采样序列
n = np.arange(N)
x = A * np.sin(2 * np.pi * f * n * Ts)
# 计算频谱
f0 = fs / N # 正频率分辨率
k = np.arange(N // 2)
X = A * N / (2j) * (np.exp(-1j * 2 * np.pi * k * f * Ts) - np.exp(1j * 2 * np.pi * k * f * Ts))
# 线性插值重构信号
t = np.linspace(0, (N-1)*Ts, 1000) # 重构时间序列
y = np.zeros_like(t)
for i in range(len(t)):
for j in range(N):
if abs(t[i]-j*Ts) < Ts/2:
y[i] += x[j] * (1 - abs(t[i]-j*Ts)/Ts)
# 绘制图形
plt.figure(figsize=(12, 4))
# 绘制原始信号
plt.subplot(1, 3, 1)
plt.plot(t, A * np.sin(2 * np.pi * f * t))
plt.title('Original Signal')
# 绘制采样信号
plt.subplot(1, 3, 2)
plt.stem(n * Ts, x, use_line_collection=True)
plt.title('Sampled Signal')
# 绘制重构信号
plt.subplot(1, 3, 3)
plt.plot(t, y.real)
plt.title('Reconstructed Signal')
plt.tight_layout()
plt.show()
```
运行上述代码,可以得到如下图所示的结果:
![image-2.png](attachment:image-2.png)
可以看出,使用线性插值可以将离散的采样序列恢复成连续的原始信号。
余弦信号的抽样与重构:
余弦信号的抽样与重构与正弦信号类似,只是在频谱上有所不同。对于余弦信号 $x(t) = A\cos(2\pi f t)$,其频谱为:
$$
X(f) = \sum_{n=0}^{N-1} x[n] e^{-j2\pi fnT_s}
= \sum_{n=0}^{N-1} A\cos(2\pi f nT_s) e^{-j2\pi fnT_s}
$$
化简上式,得到:
$$
X(f) = \frac{AN}{2} \left[\delta(f-f_0) + \delta(f+f_0)\right]
$$
其中 $f_0 = \frac{f_s}{N}$ 为正频率分辨率。因此,余弦信号的频谱仅包含正、负频率分量,且幅度相等。在重构时,需要将这两个分量合并成一个。
下面是使用线性插值重构余弦信号的代码,与正弦信号的代码类似:
```python
import numpy as np
import matplotlib.pyplot as plt
# 原始信号参数
A = 1 # 振幅
f = 1 # 频率
# 采样参数
fs = 10 * f # 采样频率
Ts = 1 / fs # 采样周期
N = 20 # 采样点数
# 生成采样序列
n = np.arange(N)
x = A * np.cos(2 * np.pi * f * n * Ts)
# 计算频谱
f0 = fs / N # 正频率分辨率
k = np.arange(N // 2)
X = A * N / 2 * (np.exp(-1j * 2 * np.pi * k * f * Ts) + np.exp(1j * 2 * np.pi * k * f * Ts))
# 合并正、负频率分量
X[0] = X[0].real
X[-1] = X[-1].real
X = np.concatenate((X[:N//2], np.flip(X[:N//2])))
# 线性插值重构信号
t = np.linspace(0, (N-1)*Ts, 1000) # 重构时间序列
y = np.zeros_like(t)
for i in range(len(t)):
for j in range(N):
if abs(t[i]-j*Ts) < Ts/2:
y[i] += x[j] * (1 - abs(t[i]-j*Ts)/Ts)
# 绘制图形
plt.figure(figsize=(12, 4))
# 绘制原始信号
plt.subplot(1, 3, 1)
plt.plot(t, A * np.cos(2 * np.pi * f * t))
plt.title('Original Signal')
# 绘制采样信号
plt.subplot(1, 3, 2)
plt.stem(n * Ts, x, use_line_collection=True)
plt.title('Sampled Signal')
# 绘制重构信号
plt.subplot(1, 3, 3)
plt.plot(t, y.real)
plt.title('Reconstructed Signal')
plt.tight_layout()
plt.show()
```
运行上述代码,可以得到如下图所示的结果:
![image-3.png](attachment:image-3.png)
可以看出,使用线性插值可以将离散的采样序列恢复成连续的原始信号。注意,在重构时需要将正、负频率分量合并成一个。