Аналогово-цифровое преобразование (квантование по уровню)

Есть вот такой код:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from numpy.fft import rfft, rfftfreq
from scipy.signal import butter, sosfiltfilt, sosfreqz, filtfilt, resample
from math import sin, pi
from pylab import *
from scipy import *
from scipy import interpolate
import samplerate
import signal
import os

def ACP(): 
    df = pd.read_csv('1.csv', sep=",",  usecols= [0,1,2,3,4,5,6,7,8,9]) #прочтение файла csv
    Fs = 140*10**6  #частота дескритизации
    N = 10    #количество точек
    t = np.arange(N)/Fs    #дискреты времени
   
    n = int(input("Номер сигнала(пример: 123): ")) # ручной ввод номера сигнала
    fc = 20*10**6  # частота среза фильтра
    w = fc/(Fs/2) # нормирование частоты
    sos = butter(2, w, 'low', output= 'sos')#задаем фильтр Баттерворта(порядок, норм частота, тип фильтра, частота дескритизации)
    output1 = sosfiltfilt(sos, df.values[n,:])# отфильтрованный сигнал
    x = np.arange(0, 10) # отсчеты по x
    y = output1 # сигнал после фильтра
    f = interpolate.interp1d(x ,y) # интерполяция
    xnew = np.arange(0, 10, 1) # новые отсчеты
    ynew = f(xnew) # новый дискретизированный сигнал
    quant_bits = 4 # глубина квантования
    quant_level = 2 ** quant_bits/2  # квантованные уровни
    quant_step = 1./ quant_level # шаг квантования
    dig_signal = np.round( ynew / quant_step) * quant_step # квантованный сигнал
    print(dig_signal)
   
    plt.plot(x, y, 'o', xnew, ynew, '-')
    plt.grid(True)
    plt.plot(xnew,dig_signal, label = 'Оцифрованный сигнал')
   
    plt.xlabel(u'Время, нc') # подпись оси х
    plt.ylabel(u'Напряжение, мВ')# ось y
    plt.title('Дискретизация и квантование сигнала')
    plt.show()


if __name__ == "__main__": # главная функция
    n = int(input("Номер сигнала(пример: 123): ")) # ручной ввод номера сигнала
    ACP()

Данный код выполняет функцию дискретизации и квантования, но с квантованием произошла загвоздочка,- на графике ниже вы видите, что ступеньки получились наклонными, хотя в каждом дискрете должна быть вертикальная линия.

График, который получается, линии не должны быть наклонными

Вот ссылка к данным '1.csv', чтобы построить график: https://drive.google.com/file/d/1GiFJWky6IfLhjbJlBbS7TDcGIHFErqyo/view?usp=sharing


Ответы (1 шт):

Автор решения: Pak Uula

Pyplot нарисовал вам именно то, что вы вы попросили - линейный график (pyplot.plot)

Вам же нужен был ступенчатый график, pyplot.step

    # plt.plot(xnew,dig_signal, label = 'Оцифрованный сигнал')
    plt.step(xnew,dig_signal, label = 'Оцифрованный сигнал')
→ Ссылка