Numpy 数组数字化模拟信号

Numpy 数组数字化模拟信号

在本文中,我们将介绍如何使用 Numpy 数组来数字化模拟信号。模拟信号是通过连续变化的电压或电流来传递信息的信号。而数字信号是通过离散化(数字化)模拟信号来传递信息的信号。这是一种基于离散化方法,比如把时间划分成一段一段的应用采样定理的数字化信号处理方法。

在数字信号处理中,模拟信号需要经过采样、量化和编码三个过程才能转换成数字信号。在这三个过程中,采样首先要将模拟信号转换成连续时间内的离散信号序列。Numpy 数组是数字信号处理及其它科学计算任务中最常使用的工具之一,是一种优秀的存储和处理数字信号的方式。

阅读更多:Numpy 教程

采样

采样是模拟信号转换成数字信号的第一步。采集数据的行为在数据科学中十分普遍,就是将连续信号数据转换成数字数据。采样的目标是将模拟的连续信号转换为离散时间序列,利用采样操作生成的离散信号称为采样率。采样率表示时间上的离散级别,因此如果将每个采样时间间隔看成一单位时间,采样率就是每秒钟采样的次数,通常用 Hz 表示采样率。Numpy 提供了许多实用工具来进行采样的操作。

以下通常所用示例代码使用的是信号 ReferenceError: katex is not defined,其中 ReferenceError: katex is not defined 是时间的连续变量,通过采样操作得到它的数字信号。

import numpy as np
import matplotlib.pyplot as plt

# 采样率
sampling_rate = 1000
# 时间点采样
time_point = 5
# 时间间隔采样
time_interval = 1 / sampling_rate
# 采样次数
n_samples = int(time_point / time_interval)

# 信号
t = np.linspace(0, time_point, n_samples)
signal = np.sin(2 * np.pi * t)

plt.plot(t, signal)
plt.xlabel('Time (s)')
plt.ylabel('Signal amplitude')
plt.show()
Python

图像显示了信号 ReferenceError: katex is not defined 采样的结果(时间采样数为 5 秒,采样率为 1000Hz)

量化

量化是模拟信号转换成数字信号的第二步。简单来说,量化就是将连续的幅度值映射到离散的幅度级别上,然后再将幅度级别用二进制编码表示。量化操作导致了数字信号的计算精度比模拟信号的精度低得多,然而这也是数字信号与模拟信号的本质区别。NumPy 提供了许多现成的函数以支持上述操作。

以下通常所用示例代码使用的是向大圆形的水平方向移动的正弦波信号 ReferenceError: katex is not defined,采样率为每秒 16 个采样点,信号噪声水平为 ReferenceError: katex is not defined。将连续信号离散化之后,我们能够看到信号增加了显著的噪声。

import numpy as np
import matplotlib.pyplot as plt

# 采样率
sampling_rate = 16
# 时间采样
time_point = 1
# 时间间隔采样
time_interval = 1 / sampling_rate
# 时间采样次数
n_samples = int(time_point / time_interval)

# 信号
t = np.linspace(0, time_point, n_samples)
signal = np.sin(2 * np.pi * t) + np.random.normal(size=n_samples) * 0.1

# 量化
bits = 8
q_min = -1  # 量化最小值
q_max = 1  # 量化最大值
q_levels = 2 ** bits  # 量化级别
q_step = (q_max - q_min) / q_levels  # 量化步长

quantized_signal = q_step * np.round(signal / q_step)

fig, ax = plt.subplots(2, 1, figsize=(10, 6))

ax[0].plot(t, signal, color='b', alpha=0.7)
ax[1].plot(t, quantized_signal, color='g', alpha=0.7)

ax[0].set(title='Continuous signal with noise',
          xlabel='Time (s)', ylabel='Amplitude')

ax[1].set(title=f'{bits}-bit quantized signal with {q_levels} levels '
                f'and step {q_step:.4f}',
          xlabel='Time (s)', ylabel='Amplitude')

plt.tight_layout()
plt.show()
Python

图像显示了经过量化的信号 ReferenceError: katex is not defined,其中原始信号(蓝色)被噪声随机抖动,量化后的信号(绿色)受到离散级别的限制,样本数变少。

编码

编码是模拟信号转换成数字信号的第三步。在这一步中,量化后的模拟幅度级别被转换成数字信号以便数字系统能够处理。编码器需要将幅度级别转换为二进制格式。常见的编码格式有二进制反码补码、格雷码等。编码的目的是为了尽可能减少所需比特数,以及解决噪声、信道丢失等问题。Numpy 提供了可操纵 Python 语言的位操作工具。

以下通常所用示例代码继续使用量化的信号 ReferenceError: katex is not defined 进行编码操作。编码器将每个采样点值映射到 ReferenceError: katex is not defined 的区间内,使用 8 位二进制数表示离散化后的值。使用 Numpy ndarray 的位操作函数可将整型变量转换为二进制字符串。

import numpy as np

# 采样率
sampling_rate = 1000
# 时间采样
time_point = 5
# 时间间隔采样
time_interval = 1 / sampling_rate
# 采样次数
n_samples = int(time_point / time_interval)

# 信号
t = np.linspace(0, time_point, n_samples)
signal = np.sin(2 * np.pi * t) + np.random.normal(size=n_samples) * 0.1

# 量化
bits = 8
q_min = -128  # 量化最小值
q_max = 127  # 量化最大值
q_levels = 2 ** bits  # 量化级别
q_step = (q_max - q_min) / q_levels  # 量化步长

quantized_signal = q_step * np.round(signal / q_step)

# 编码
encoded_signal = quantized_signal.astype(int)
encoded_signal_bin = np.binary_repr(encoded_signal, width=bits)

print(f'Signal amplitude: {signal[0]:.2f}')
print(f'Quantized signal amplitude: {quantized_signal[0]:.2f}')
print(f'Encoded signal at t=0: {encoded_signal_bin[ind]:08b}')
Python

执行上述程序,输出为:

Signal amplitude: 0.43
Quantized signal amplitude: 0.50
Encoded signal at t=0: 00001111
Python

编码将量化后的信号转换为 8 位二进制数表示的数字信号。在上述例子中,执行编码器操作后,第一个采样点的量化信号映射到 ReferenceError: katex is not defined 左右,对应的二进制字符串为 00001111,使用此方法,我们可以将整个数字信号转换为二进制数,并以此形式在计算机系统中存储和处理。

总结

本文介绍了数字信号处理中的三个主要操作——采样、量化和编码,以及 Numpy 数组是数字信号处理的最常用工具之一的原因。在数字信号处理中,采样、量化和编码是不可或缺的步骤,合理的数字信号处理方法可以为科学研究和实际应用提供强有力的支持和帮助。通过本文所介绍的方法,我们可以更好地理解和应用数字信号处理的基础知识。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册