Аналогово-цифровое преобразование (квантование по уровню)
Есть вот такой код:
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 = 'Оцифрованный сигнал')
