使用 Python 进行模数转换

信息处理 采样 Python 模数 量化
2022-02-06 05:55:28

我是初学者。我尝试使用 Python 模拟模拟信号转换为数字(包括按时间采样和按电平量化)。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

time_of_view        = 1.; # s.
analog_time         = np.linspace (0, time_of_view, 10e5); # s.

sampling_rate       = 20.; # Hz
sampling_period     = 1. / sampling_rate; # s
sample_number       = time_of_view / sampling_period;
sampling_time       = np.linspace (0, time_of_view, sample_number);

carrier_frequency   = 9.;
amplitude           = 1;
phase               = 0;

quantizing_bits     = 4;
quantizing_levels   = 2 ** quantizing_bits / 2;
quantizing_step     = 1. / quantizing_levels;

def analog_signal (time_point):
    return amplitude * np.cos (2 * np.pi * carrier_frequency * time_point + phase);
sampling_signal     = analog_signal (sampling_time);
quantizing_signal   = np.round (sampling_signal / quantizing_step) * quantizing_step;


fig = plt.figure ()
plt.plot (analog_time,   analog_signal (analog_time) );
#plt.stem (sampling_time, sampling_signal);
plt.stem (sampling_time, quantizing_signal, linefmt='r-', markerfmt='rs', basefmt='r-');
plt.title("Analog to digital signal conversion")
plt.xlabel("Time")
plt.ylabel("Amplitude")

plt.show()

在此处输入图像描述

总的来说,我对此感到满意:如果我使用变量,那么结果对我来说是预期的。除了一件事:根据清单sampling_rate = 20carrier_frequency = 9因为sampling_rate / carrier_frequency > 2我希望转换成功,但我得到了失真的信号(看图片:输出信号的包络已经清楚地表达了幅度调制)。我的错误在哪里?我的实现是否正确?

1个回答

您看到这一点是因为您的采样太接近奈奎斯特速率,但不要担心,尽管它似乎有混叠,但是您的采样系统运行良好并且信号没有混叠。为了更加确定,只需看一下频域中的采样信号:信号频率[1] 如您所见,只有第 9 个 bin 处于活动状态,所有其他 bin 均为零,因此采样中不会发生混叠。FFT 计算的代码(MATLAB)为:

Fs = 20;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = length(sampling_signal);  % Length of signal
t = (0:L-1)*T;                % Time vector
y = sampling_signal;     % Sinusoids plus quantization noise
NFFT = 2^nextpow2(L); 
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

笔记!我已将 time_of_view 更改为 10 秒,以避免 FFT 泄漏(您在第 9 个 bin 附近看到的旁瓣)。

可以将信号速率提高到接近奈奎斯特速率,只要您不打算将信号返回到模拟域,因为这样您的 DAC 需要在输出中使用非常锐利的低通滤波器,并且它的实现也是如此很难(如果不是不可能的话)。本文直观地解释了抽样问题,抽样:奈奎斯特没有说什么,以及如何处理它