数字信号处理及python实现(三)

news2024/10/2 10:31:53

数字信号处理及python实现三

  • 抽样引起的混叠
  • 抽样的频域视图
  • 样本重建信号
    • 拟合正弦波
    • 线性与多项式内插
  • 理想低通滤波器

这是参考知乎的数字信号处理及matlab实现的python实现版本,参考连接

上一期:数字信号处理及python实现(二)

项目文件结构
在这里插入图片描述
test为测试文件,window为项目文件

抽样引起的混叠

    def test_sample1(self):
        signal = Signal()
        f0 = 500
        n = np.array(list(range(0, 23)))
        fs1 = 100  # 采样频率为100Hz

        x1 = np.sin(2 * np.pi * f0 * n / fs1 + np.pi / 3)
        X1, W1 = signal.dtft(x1, 1000)  # 对x1进行DTFT变换
        fs2 = 1000  # 采样频率为1kHz
        x2 = np.sin(2 * np.pi * f0 * n / fs2 + np.pi / 3)
        X2, W2 = signal.dtft(x2, 1000)  # 对x2进行DTFT变换
        fs3 = 10000  # 采样频率为10kHz
        x3 = np.sin(2 * np.pi * f0 * n / fs3 + np.pi / 3)
        X3, W3 = signal.dtft(x3, 1000)  # 对x3进行DTFT变换

        plt.subplot(3, 2, 1);
        plt.stem(n, x1)  # 绘制fs = 100
        # Hz时域采样结果
        plt.title('fs=100Hz时域采样结果')
        plt.xlabel('n')
        plt.ylabel('x1(n)')
        plt.grid(visible=True)

        plt.subplot(3, 2, 2)
        plt.plot(W1, X1)
        plt.title('fs=100Hz时x1(n)的DTFT')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$X1(e^{jw})$')
        plt.grid(visible=True)

        plt.subplot(3, 2, 3)
        plt.stem(n, x2)  # 绘制fs = 1
        # kHz时域采样结果
        plt.title('fs=1kHz时域采样结果')
        plt.xlabel('n')
        plt.ylabel('$x2(n)$')
        plt.grid(visible=True)

        plt.subplot(3, 2, 4)
        plt.plot(W2, X2)
        plt.title('fs=1000Hz时x1(n)的DTFT')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$X2(e^{jw})$')
        plt.grid(visible=True)

        plt.subplot(3, 2, 5);
        plt.stem(n, x3)  # 绘制fs = 10
        # kHz时域采样结果
        plt.title('fs=10kHz时域采样结果')
        plt.xlabel('n')
        plt.ylabel('$x3(n)$')
        plt.grid(visible=True)

        plt.subplot(3, 2, 6)
        plt.plot(W3, X3)
        plt.title('fs=10kHz时x1(n)的DTFT')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$X3(e^{jw})$')
        plt.grid(visible=True)

        plt.tight_layout()
        plt.savefig('data/images/sample1.png')

在这里插入图片描述

抽样的频域视图

    def test_sample_fourier(self):
        dt = 0.00001  # 给出一个无限小的间隔
        t = np.arange(-0.005, 0.005 + dt, dt)  # 给出t的取值范围

        xa = np.exp(-1000 * abs(t))  # xa的时域表达式
        Wmax = 2 * np.pi * 2000  # 给出频率的最大值
        K = 600
        k = np.array(list(range(0, K + 1)))
        W = k * Wmax / K  # W的范围
        Xa = np.array(np.matrix(xa) * np.exp(np.complex(0, -1) * np.matrix(t).T * np.matrix(W)) * dt)
        Xa = np.real(Xa)  # 连续时间傅里叶变换
        len_W = len(W)
        W.resize(1, len_W)

        W = np.concatenate([-np.fliplr(W)[0], W[0][1:]], axis=0)  # 给出频率的范围
        Xa = np.concatenate([np.fliplr(Xa)[0], Xa[0][1:]], axis=0)  # 给出Xa的范围

        plt.subplot(1, 2, 1)
        plt.plot(t * 1000, xa)  # 绘出xa(t)的时域图形
        plt.title('xa(t)的时域图形')
        plt.xlabel('t')
        plt.ylabel('xa(t)')

        plt.subplot(1, 2, 2)
        plt.plot(W / (2 * np.pi * 1000), Xa * 1000)  # 绘出xa(t)的傅里叶变换的频谱
        plt.title('xa(t)的傅里叶变换')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$Xa(jw)$')

        plt.tight_layout()
        plt.savefig('data/images/sample_fourier.png')

在这里插入图片描述
e.g. x a ( t ) = e − 1000 ∣ t ∣ x_a(t)=e^{-1000|t|} xa(t)=e1000t,绘制其傅里叶变换 X a ( j Ω ) X_a(j\Omega) Xa(jΩ)

    def test_sample_fourier(self):
        dt = 0.00001  # 给出一个无限小的间隔
        t = np.arange(-0.005, 0.005 + dt, dt)  # 给出t的取值范围

        xa = np.exp(-1000 * abs(t))  # xa的时域表达式
        Wmax = 2 * np.pi * 2000  # 给出频率的最大值
        K = 600
        k = np.array(list(range(0, K + 1)))
        W = k * Wmax / K  # W的范围
        Xa = np.array(np.matrix(xa) * np.exp(np.complex(0, -1) * np.matrix(t).T * np.matrix(W)) * dt)
        Xa = np.real(Xa)  # 连续时间傅里叶变换
        len_W = len(W)
        W.resize(1, len_W)

        W = np.concatenate([-np.fliplr(W)[0], W[0][1:]], axis=0)  # 给出频率的范围
        Xa = np.concatenate([np.fliplr(Xa)[0], Xa[0][1:]], axis=0)  # 给出Xa的范围

        plt.subplot(1, 2, 1)
        plt.plot(t * 1000, xa)  # 绘出xa(t)的时域图形
        plt.title('xa(t)的时域图形')
        plt.xlabel('t')
        plt.ylabel('xa(t)')

        plt.subplot(1, 2, 2)
        plt.plot(W / (2 * np.pi * 1000), Xa * 1000)  # 绘出xa(t)的傅里叶变换的频谱
        plt.title('xa(t)的傅里叶变换')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$Xa(jw)$')

        plt.tight_layout()
        plt.savefig('data/images/sample_fourier.png')

在这里插入图片描述
当频率为 5000 H z 5000Hz 5000Hz 1000 H z 1000Hz 1000Hz分别时,画出其DTFT

    def test_sample_fourier_frequency(self):
        t1 = 0.0002  # 频率5000Hz进行采样
        t2 = 0.001  # 频率1000Hz进行采样
        n = np.array(list(range(-25, 26)))
        x1 = np.exp(-1000 * abs(n * t1))  # x1的时域表达式
        x2 = np.exp(-1000 * abs(n * t2))  # x2的时域表达式
        K = 500
        k = np.array(list(range(0, K + 1)))
        w = k * np.pi / K  # w的取值范围

        X1 = np.array(np.matrix(x1) * np.exp(np.complex(0, -1) * np.matrix(n).T * np.matrix(w)))
        X1 = np.real(X1)  # 做x1的DTFTX1
        X2 = np.array(np.matrix(x2) * np.exp(np.complex(0, -1) * np.matrix(n).T * np.matrix(w)))
        X2 = np.real(X2)  # 做x2的DTFTX2

        len_w = len(w)
        w.resize(1, len_w)
        w = np.concatenate([-np.fliplr(w)[0], w[0][1:]], axis=0)  # 给出频率的范围
        X1 = np.concatenate([np.fliplr(X1)[0], X1[0][1:]], axis=0)  # 给出X1的范围
        X2 = np.concatenate([np.fliplr(X2)[0], X2[0][1:]], axis=0)  # 给出X2的范围

        plt.subplot(1, 2, 1)
        plt.plot(w / np.pi, X1)  # 采样频率为5000Hz时x1(n)的DTFT
        plt.title('采样频率为5000Hz时x1(n)的DTFT')
        plt.xlabel('FREQUENCY')
        plt.ylabel('$X1(jw)$')
        plt.grid(visible=True)

        plt.subplot(1, 2, 2)
        plt.plot(w / np.pi, X2)  # 采样频率为1000Hz时x2(n)的DTFT
        plt.title('采样频率为1000Hz时x2(n)的DTFT');
        plt.xlabel('FREQUENCY')
        plt.ylabel('$X2(jw)$')
        plt.grid(visible=True)

        plt.tight_layout()
        plt.savefig('data/images/sample_fourier_frequency.png')

在这里插入图片描述

样本重建信号

拟合正弦波

    def test_reconstruction_fitting(self):
        t = np.arange(0, 2 * np.pi + 0.01, 0.01)
        x = 3 * np.cos(np.pi * t / 4)

        ax = plt.axes()
        plt.title('解出频率为w=pi/4的信号')
        plt.xlabel('t')
        plt.ylabel('x(t)')

        ax.set_xticks(t)  # 在细密的网格上绘出产生的正弦信号
        plt.plot(t, x)
        plt.grid(visible=True)

        plt.savefig('data/images/sample_reconstruction_fitting.png')

在这里插入图片描述

线性与多项式内插

直线段连接样本

    def test_interpolation1(self):
        x = [5, 3, -1]
        n = list(range(0, 3))
        t = np.arange(0, 2, 0.01)

        ax = plt.axes()
        ax.set_xticks(t)
        plt.plot(n, x)
        plt.grid(visible=True)

        plt.savefig('data/images/sample_interpolation1.png')

在这里插入图片描述
将三角形冲激响应与三个样本进行卷积

    def test_interpolation2(self):
        A = [0.2, 0.4, 0.6, 0.8, 1.0, 0.8, 0.6, 0.4, 0.2]
        B = [5, 0, 0, 0, 0, 3, 0, 0, 0, 0, -1]
        t = np.array(list(range(-4, 15)))
        Z = scipy.signal.convolve(A, B)

        vv = [0, 5, 3, -1, 0]
        xx = np.array(list(range(-1, 4)))
        xq = np.arange(-1, 3 + 0.1, 0.1)
        f = scipy.interpolate.interp1d(xx, vv, kind='linear')
        vq = f(xq)

        plt.subplot(2, 2, 1)
        plt.plot(t / 5, Z, 'rs', xq, vq, 'b^')
        # 绘出卷积的结果和线性插值的结果,分别用红色和蓝色表示
        plt.xlabel('t')
        plt.ylabel('x(t)')
        plt.legend(['卷积的结果', '线性插值结果'])
        plt.subplot(2, 2, 2)
        plt.plot(t / 5, Z, 'rs')  # 绘出卷积的结果
        plt.title('卷积的结果')
        plt.xlabel('t')
        plt.ylabel('x(t)')
        plt.subplot(2, 2, 3)
        plt.plot(xq, vq, 'b^')  # 线性插值的结果
        plt.title('线性插值结果')
        plt.xlabel('t')
        plt.ylabel('x(t)')
        plt.grid(visible=True)

        plt.tight_layout()
        plt.savefig('data/images/sample_interpolation2.png')

在这里插入图片描述
将这三个数据点拟合为二阶多项式

    def test_polynomial_interpolation(self):
        x = [5, 3, -1]
        n = np.array(list(range(0, 3)))
        p = np.polyfit(n, x, 2)
        nn = np.arange(-5, 5 + 0.5, 0.5)
        f = np.polyval(p, nn)
        t = np.arange(-5, 5 + 0.1, 0.1)

        ax = plt.axes()
        plt.legend(['样本点二阶多项式拟合结果'])
        plt.xlabel('t')
        ax.set_xticks(t)
        plt.plot(n, x, 'o', nn, f)

        plt.grid(visible=True)

        plt.savefig('data/images/polynomial_interpolation.png')

在这里插入图片描述

理想低通滤波器

对t=0处的数值为1的单点样本进行插值,绘出大约从-5到5的结果。它应该和sinc函数形状相一致。

    def test_low_pass_filter1(self):
        t = np.arange(-5, 5 + 0.01, 0.01)
        x1 = np.sinc(t)

        plt.subplot(2, 1, 1)
        plt.plot(t, x1)
        plt.title('单点样本插值结果')
        plt.xlabel('t')
        plt.ylabel('x1(t)')
        plt.grid(visible=True)

        plt.subplot(2, 1, 2)
        plt.plot(t, np.sinc(t))
        plt.title('sinc(t)')
        plt.xlabel('t')
        plt.ylabel('sinc(t)')
        plt.grid(visible=True)

        plt.tight_layout()
        plt.savefig('data/images/low_pass_filter1.png')

在这里插入图片描述
x a ( t ) Σ n = − ∞ ∞ x a ( n t ) sin ⁡ ( π ( t − n T s ) / T s ) π ( t − n T s ) / T s x_a(t)\overset{\infty}{\underset{n=-\infty}{\Sigma}}x_a(nt)\frac{\sin(\pi(t-nT_s)/T_s)}{\pi(t-nT_s)/T_s} xa(t)n=Σxa(nt)π(tnTs)/Tssin(π(tnTs)/Ts)给定及实验内容中的三点情形进行插值。

    def test_low_pass_filter2(self):
        xn = np.array([5, 3, -1])
        M = 0
        N = 2
        n = np.array(list(range(M, N + 1)))
        Ts = 1
        t1 = np.arange(-1, 5 + 0.05, 0.05)
        xa = np.matrix(xn) * np.matrix(np.sinc(np.array(
            np.matrix(1 / Ts * (np.ones([len(n), 1])) * np.matrix(t1)) - np.array(
                np.matrix(n).T * np.matrix(Ts) * np.matrix(np.ones([1, len(t1)]))))))
        xa = np.array(xa)[0]
        # 基于(3.18)的内插表达式
        x = [5, 3, -1]  # 直线段的转折点
        n = np.array(list(range(0, 3)))
        A = [0.2, 0.4, 0.6, 0.8, 1.0, 0.8, 0.6, 0.4, 0.2]  # 冲激响应
        B = [5, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1]
        tt = np.array(list(range(-4, 15)))
        C = scipy.signal.convolve(A, B)  # 计算线性插值

        plt.xlabel('t')
        plt.ylabel('x(t)')  # 拟合正弦波
        plt.plot(t1, xa, n, x, 'o-m', tt / 5, C, '.-b')
        # 将直线段与正弦波进行拟合,其中直线拟合用洋红色曲线来表示,线性插值结果用蓝色曲线来表示
        plt.stem(range(M, N + 1), xn, 'k')
        plt.legend(['sinc函数', '直线拟合', '线性插值结果'])
        plt.grid(visible=True)

        plt.savefig('data/images/low_pass_filter2.png')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】Vue开发实战之我的笔记(ch18-ch27)--20221115

参考https://blog.csdn.net/yfm120750310/article/details/111353963 18 | 为什么需要Vuex 18.1 为什么需要Vuex provide和inject虽然能够实现层层传递的数据管理,但对于一个大的管理系统而言会显得有些繁琐,我们需要一个大型的状态管理系统。 Vuex不…

甘特图是什么?如何快速搭建?

甘特图是什么? 甘特图是一种条状图,直观展示项目进展随时间的走势及联系。其中,项目时间由横轴表示,项目活动由纵轴表示。整体线条表示整个项目期间内,计划和实际的活动完成情况。甘特图起初用于美国胡佛水坝和美国洲…

cpe(通用平台枚举)命名规范及python CPE库实战

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

一文看懂Linux 页表、大页与透明大页

一、 内存映射与页表 1. 内存映射 我们通常所说的内存容量,指的是物理内存,只有内核才可以直接访问物理内存,进程并不可以。 Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,…

如何用Python 快速搭建HTTP服务器

Python具有语法简单、语句清晰的特点,而且Python的兼容性比较好,可以将其他语言制作的模块联结起来,具有强大且丰富的库,封装后可以轻松调用,因此成为编程语言中的“网红“,甚至被称为非计算机从业者的第一语言。 Python在IT就业市场也是最受欢迎、最热门的技术技能…

SpringBoot整合Redis

SpringBoot整合Redis 文章目录SpringBoot整合Redis一 .简介1. redie是什么?2. redie的使用场景?二 . 使用1. 引入依赖2. 配置文件3. 启动redis4. 创建Redis工具类5. 创建测试类6. 查看效果一 .简介 1. redie是什么? Redis是现在最受欢迎的N…

图解计算机的存储器金字塔

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 在计算机组成原理中的众多概念中,开发者接触得最…

LeetCode-剑指43-1-n整数中出现1的次数

1、逐位统计 我们统计每一位k上面可能出现1的次数:1、对于每一位k上面的出现的1,我们首先统计其出现(n/10k)10k−1(n/10^k)\times10^{k-1}(n/10k)10k−1次的1;2、考虑到存在余数的情况,我们还需要比较剩余余数中出现1的次数&…

浅谈HTTP缓存与CDN缓存的那点事

HTTP缓存与CDN缓存一直是提升web性能的两大利器,合理的缓存配置可以降低带宽成本、减轻服务器压力、提升用户的体验。而不合理的缓存配置会导致资源界面无法及时更新,从而引发一系列的衍生问题。本文将分别将从HTTP缓存与cdn缓存的规则、流程、配置入手&…

XSS挑战之旅1-10关

文章目录前言第1关第2关第3关第4关第5关第6关第7关第8关第9关第10关前言 漏洞介绍:XSS漏洞 参考文章:XSS挑战之旅 游戏规则:触发alert()弹窗,进入下一关 第1关 进入第一关 随便输入一下,观测输出,看源代…

还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7

数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别。主要原因是:一方面,数据库开发者对各个级别的理解有细微差异;另一方面,实现层面没有达到理论上的要求。 用户在使用或开发者在交…

147. SAP UI5 SmartTable 控件的使用介绍

本文来自笔者 SAP 开发技术交流知识星球内一位朋友的提问: smartfilter bar 有个输入框Cost Element绑定了cds实现value help 请问其对应的suggestion功能是通过cds的注解实现的嘛? 要回答这个问题,我们必须首先掌握 SAP UI5 SmartTable 控件的使用方式,然后才能深入探究 …

【Tensorflow】使用Tensorflow自定义模型和训练

Tensorflow的核心与NumPy非常相似,但具有GPU支持;Tensorflow支持分布式计算(跨多个设备和服务器)。 像NumPy一样使用TensorFlow 运算符是在Python 3.5 中添加的,用于矩阵乘法,等效于 tf.matmul() 函数。…

C++数据结构迷宫哈希表二叉树

C数据结构迷宫哈希表二叉树 《数据结构》应用系统设计——迷宫问题 问题描述:设计算法求出并显示从入口点到出口点可沿八个方向前进的一条通路,或显示没有通路 难度:易 基本要求: (1)键盘(或文件)输入迷宫行数m和列数n,计算机随机生成迷宫(或从文件读入…

robots (攻防世界)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 进入网址 啥也没有 解题工具: 额...浏览器? (可能还需要百度) 问题解析: 科普时间到 robots协议也称爬虫协议、爬虫规则等, 是指网站建立一个robots.txt文件来告诉搜索引擎哪些…

安卓 手机硬改 工具下载 一键新机 改串 抹机 root隐藏 改串号MEID imei SN信息 工具教程分享

一键新机、模拟机型、一键备份、还原APP数据、ROOT隐藏、修改数据、保护隐私 一键新机 超过3000机型一键模拟、无束缚轻松做注册、激活、留存 安卓/IOS(进行中) 支持目前最流行的机型,安卓全机型兼容,我们坚持领先一步 操作简单 适合脚本作者 群控…

为了验证某些事,我实现了一个toy微前端框架【万字长文,请君一览】

众所周知微前端是企业中前端发展的必经之路。 我司搭建了自己的微前端脚手架工具,它将项目变成了“多页应用”,跳转方式由 location.href 这类api进行。所以笔者之前在想:这种方式跳转能不能有动画效果呢? 在“上层建筑”中进行“…

【文件同步和备份软件】上海道宁为您带来GoodSync软件,让您轻松备份和同步您的文件

GoodSync发布于2006年 是一种简单可靠的文件同步和 备份解决方案 使用GoodSync可以轻松备份和 同步您的文件 确保您的文件绝对不会丢失 GoodSync企业版是 为商用设计的 数据备份、同步和恢复软件 适用于所有平台、项目或业务环境 保护我们的商业数据 开发商介绍 Siber…

golang开发相关面试题

目录 go有哪些数据类型? 方法与函数有什么区别? 方法中值接收者与指针接收者的区别是什么? 函数返回局部变量的指针是否安全? 函数参数传递值是值传递还是引用传递? defer关键字的实现原理? 内置函数make和new的区别? slice底层实现原理? array与slice的区别是…

GICv3和GICv4虚拟化

本文档翻译自文档Arm Generic Interrupt Controller v3 and v4 - Virtualization 1 虚拟化 Armv8-A选择性的支持虚拟化。为了完成该功能,GICv3也支持虚拟化。GICv3中对虚拟化的支持包括如下功能: CPU Interface寄存器的硬件虚拟化产生和发送虚拟中断的…