用matlab绘制正、余弦信号的抽样与重构
时间: 2023-12-03 07:46:26 浏览: 73
好的,下面是绘制正弦信号的抽样与重构的MATLAB代码:
```matlab
% 设置信号参数
f = 5; % 信号频率
fs = 50; % 采样频率
Ts = 1/fs; % 采样间隔
t = 0:Ts:1; % 时间向量
x = sin(2*pi*f*t); % 正弦信号
% 绘制原始信号
subplot(3,1,1)
plot(t,x)
title('原始信号')
% 抽样
Ts_new = 0.1; % 新采样间隔
n = 0:Ts_new:1; % 抽样时间向量
xn = sin(2*pi*f*n); % 抽样信号
% 绘制抽样信号
subplot(3,1,2)
stem(n,xn)
title('抽样信号')
% 重构
xr = zeros(size(t)); % 初始化重构信号向量
for i = 1:length(n)
xr = xr + xn(i)*sinc((t-n(i))/Ts);
end
% 绘制重构信号
subplot(3,1,3)
plot(t,xr)
title('重构信号')
```
同样,如果需要绘制余弦信号的抽样与重构,只需将上述代码中的“sin”改为“cos”。
相关问题
展示正、余弦信号的抽样与重构
正弦信号的抽样与重构:
假设原始信号为 $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)
可以看出,使用线性插值可以将离散的采样序列恢复成连续的原始信号。注意,在重构时需要将正、负频率分量合并成一个。
使用matlab绘制余弦函数的抽样脉冲的代码
以下是使用MATLAB绘制余弦函数的抽样脉冲的代码:
```matlab
% 定义参数
A = 1; % 余弦函数的振幅
f = 2; % 余弦函数的频率
Fs = 10*f; % 抽样频率
T = 1/f; % 余弦函数的周期
N = 5; % 抽样点数
% 生成时间向量
t = 0:1/Fs:N*T-1/Fs;
% 生成余弦函数
x = A*cos(2*pi*f*t);
% 抽样
n = 0:N-1;
xn = A*cos(2*pi*f*n*T);
% 绘制图形
subplot(2,1,1);
plot(t,x);
title('原始信号');
xlabel('时间(秒)');
ylabel('幅值');
subplot(2,1,2);
stem(n*T,xn);
title('抽样信号');
xlabel('时间(秒)');
ylabel('幅值');
```
这段代码将生成一个图形窗口,其中包含两个子图。第一个子图显示原始余弦函数,第二个子图显示抽样脉冲。在第二个子图中,抽样脉冲的幅值为余弦函数在抽样时间点上的值。