25
Ноя
2020

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

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

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

Источник: https://ru.stackoverflow.com/questions/1209650/%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE-%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B5-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B2%D0%B0%D0%BD%D1%82%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE-%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8E

Тебе может это понравится...

Добавить комментарий