赞
踩
数字重现是指在对同样的数据或实验进行多次重复时,得到相似或相同的结果。
目录
想象一下你正在研究一个新的药物,你希望知道它是否能够治疗某种疾病。为了测试这个药物的有效性,你会进行多次实验。如果每次实验的结果都很相似,即药物在不同实验中都有相似的治疗效果,那就是数字重现。这意味着你的实验是可靠的并且结果是可信的。
为什么数字重现很重要呢?因为它能够验证科学研究的可靠性。如果某个研究只是在单次实验中得到了某些结果,那么这个结果的可信度就不高。但是,如果这个结果在多次重复的实验中反复出现,那么我们就可以相信这个结果是稳定和可靠的。这就是为什么科学研究经常要求进行多次实验并进行数字重现。
数字重现还有助于排除偶然性的误差。有时候,一个实验的结果可能受到一些偶然的因素影响,例如实验条件、测量误差等。通过进行多次实验,我们可以看到这些偶然因素的影响是否被消除,以确保结果的可靠性。
本文的这个实验主要利用插值法进行抽样信号的复原,对于插值法,不了解的小伙伴可以上网查查,百度上给出的定义是:
插值法,也称为“内插法”,是一种利用函数在某个区间中已知的若干点的函数值,构造一个特定的函数,以便在该区间的其他点上估计函数值的近似方法。这个特定的函数通常是多项式,因此被称为多项式插值。插值法可以分为几种类型:
1.线性插值。使用两个相邻数据点之间的直线进行插值,这种方法简单直观,但在数据点之间可能会产生不连续或不光滑的曲线。
2.多项式插值。使用多项式函数来拟合数据点之间的曲线,包括拉格朗日插值和牛顿插值。拉格朗日插值构造一个多项式函数,使得该函数在已知数据点上与原始函数完全一致,保证插值曲线通过已知数据点,但在高次插值中可能会出现振荡现象。牛顿插值则是通过构造一个递推的多项式,同样保证插值曲线通过已知数据点,且在高次插值中不容易出现振荡现象。
3.样条插值。这是一种更平滑的插值方法,通过使用分段连续的低次多项式来逼近数据,从而得到一条平滑的曲线。最常见的样条插值方法是三次样条插值,它在给定的数据点上构造一组三次多项式来实现数据的插值,可以更好地逼近实际曲线,并且可以通过调整边界条件来控制曲线的性质。
不过python作为面向对象编程语言,使用起来倒也不需要管这么多,scipy有自带的interpolate方法,轻松实现你想要的插值方法,以下是具体实现步骤:
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy.interpolate import interp1d
- import time
- frequency = 2
- duty_cycle = 0.4
- pulse_width = 0.3
- T = 10/frequency # 设置模拟时长
- N = 10000 # 设置采样点数
- f = 1/T
- def creat_sig():
- x = np.linspace(0, 10, num=11, endpoint=True)
- y = np.sin(2*np.pi*f*x) + np.random.normal(loc=0, scale=0.3, size=11)
- return x, y
-
- def sampling(x, y):
- f_linear = interp1d(x, y, kind='linear')
- x_new = np.linspace(0, 10, num=101, endpoint=True)
- y_linear = f_linear(x_new)
- f_cubic = interp1d(x, y, kind='cubic')
- y_cubic = f_cubic(x_new)
- return y_cubic, y_linear
- start = time.time()
-
- x, y = creat_sig()
- y1, y2 = sampling(x, y)
- x_ = np.linspace(0, 10, 101)
-
- freqs = np.fft.fftfreq(N, T/N) # 计算频率轴
-
- fft_result_1 = np.fft.fft(y1)/N # 进行FFT变换,归一化处理
- amplitudes_1 = 2 * np.abs(fft_result_1[:N//2]) # 获取振幅信息(仅需使用正半轴数据)
-
- fft_result_2 = np.fft.fft(y2)/N # 进行FFT变换,归一化处理
- amplitudes_2 = 2 * np.abs(fft_result_1[:N//2]) # 获取振幅信息(仅需使用正半轴数据)
- plt.subplot(511)
- plt.title("original signal")
- plt.plot(x, y)
- x_0 = np.linspace(0, 10, 5000)
- plt.subplot(512)
- plt.title("linear interpolate")
- plt.plot(x_, y2, 'r')
- plt.subplot(513)
- plt.title("cubic interpolate")
- plt.plot(x_, y1, 'b')
-
- plt.subplot(514)
- plt.title("fft of linear one")
- plt.plot(x_, amplitudes_2)
-
- plt.subplot(515)
- plt.title("fft of cubic one")
- plt.plot(x_, amplitudes_1)
-
- plt.show()
-
- end = time.time()
-
- print(f"总耗时:{end - start}秒")

- import numpy as np
- import matplotlib.pyplot as plt
-
- t1 = np.linspace(0, 2, 2000)
- y1 = 10 * np.sin(2 * np.pi * 505 * t1) + np.sin(2 * np.pi *504 * t1) + np.sin(2 * np.pi *506 * t1)
-
- t2 = np.linspace(0, 2, 20000)
- y2 = 10 * np.sin(2 * np.pi * 505 * t2) + np.sin(2 * np.pi *504 * t2) + np.sin(2 * np.pi *506 * t2)
-
- plt.subplot(211)
- plt.plot(t1, y1)
-
- plt.subplot(212)
- plt.plot(t2, y2)
-
- plt.show()
-
- k3 = 5
- k4 = 10
- k5 = 11
- k6 = 20
-
- t3 = t2[1:len(t2) + 1:k3]
- y3 = y2[1:len(y2) + 1:k3]
-
- t4 = t2[1:len(t2) + 1:k4]
- y4 = y2[1:len(t2) + 1:k4]
-
- t5 = t2[1:len(t2) + 1:k5]
- y5 = y2[1:len(t2) + 1:k5]
-
- t6 = t2[1:len(t2) + 1:k6]
- y6 = y2[1:len(t2) + 1:k6]
-
-
- plt.subplot(411)
- plt.plot(t3, y3)
- plt.title("interval:5")
-
- plt.subplot(412)
- plt.plot(t4, y4)
- plt.title("interval:10")
-
- plt.subplot(413)
- plt.plot(t5, y5)
- plt.title("interval:11")
-
- plt.subplot(414)
- plt.plot(t6, y6)
- plt.title("interval:20")
-
- plt.show()

要求:运行以上代码,分析其结果含义,欢迎在评论区留言交流。
觉得有帮助的小伙伴还请点个关注
后续会持续分享 免费、高质量的高校相关以及Python学习文章
(拒绝AI水文章)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。