展示正、余弦信号的抽样与重构

时间: 2023-08-07 08:07:31 浏览: 67
正弦信号的抽样与重构: 假设原始信号为 $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) 可以看出,使用线性插值可以将离散的采样序列恢复成连续的原始信号。注意,在重构时需要将正、负频率分量合并成一个。

相关推荐

最新推荐

recommend-type

正余弦信号的fft dft的谱分析

就正余弦信号做fft dft变换,并有其谱分析及相关结论等等,小结,分析,原理等等
recommend-type

C语言绘制余弦、正弦曲线

主要为大家详细介绍了C语言绘制余弦、正弦曲线的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Java基于余弦方法实现的计算相似度算法示例

主要介绍了Java基于余弦方法实现的计算相似度算法,简单说明了余弦相似性的概念、原理并结合实例形式分析了java实现余弦相似性算法的相关操作技巧,需要的朋友可以参考下
recommend-type

图像变换之傅里叶_离散余弦变换.ppt

该PPT介绍了图像变换领域中的两个基础的变换, 傅里叶变换和离散余弦变换. 涉及内容包括一维傅里叶变换, 二维离散傅里叶变换, 二维离散傅里叶变换的性质, 快速傅里叶变换, 傅里叶变换在图像处理中的应用; 离散余弦...
recommend-type

python代码如何实现余弦相似性计算

主要介绍了python代码如何实现余弦相似性计算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

优化MATLAB分段函数绘制:提升效率,绘制更快速

![优化MATLAB分段函数绘制:提升效率,绘制更快速](https://ucc.alicdn.com/pic/developer-ecology/666d2a4198c6409c9694db36397539c1.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB分段函数绘制概述** 分段函数绘制是一种常用的技术,用于可视化不同区间内具有不同数学表达式的函数。在MATLAB中,分段函数可以通过使用if-else语句或switch-case语句来实现。 **绘制过程** MATLAB分段函数绘制的过程通常包括以下步骤: 1.
recommend-type

SDN如何实现简易防火墙

SDN可以通过控制器来实现简易防火墙。具体步骤如下: 1. 定义防火墙规则:在控制器上定义防火墙规则,例如禁止某些IP地址或端口访问,或者只允许来自特定IP地址或端口的流量通过。 2. 获取流量信息:SDN交换机会将流量信息发送给控制器。控制器可以根据防火墙规则对流量进行过滤。 3. 过滤流量:控制器根据防火墙规则对流量进行过滤,满足规则的流量可以通过,不满足规则的流量则被阻止。 4. 配置交换机:控制器根据防火墙规则配置交换机,只允许通过满足规则的流量,不满足规则的流量则被阻止。 需要注意的是,这种简易防火墙并不能完全保护网络安全,只能起到一定的防护作用,对于更严格的安全要求,需要
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。