Реализация модуля АЦП(квантование и дискретизация) в python 3
Проблема заключается в том, что мне нужно как-то регулировать степень дискретизации по времени, чтобы выполнить, к примеру, передискретизацию отфильтрованного сигнала, а также квантование с заданием его глубины, в программе отфильтрованный сигнал обозначается как output1. Пока я смог только построить на уровне графиков цифровой сигнал, но он статичен и такие параметры как дискретизация и квантование нерегулируемы.
Код прилагается:
import pandas as pd #import csv file
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
from math import sin, pi
from pylab import *
from scipy import *
import os
#вывод данных
def csv(n):
print(df.loc[n]) # вывод значений второй строки, нулевая(первая)- наименование столбцов
spectrum = rfft(df.loc[n]) # прямое одномерное ПФ
plt.plot(np.arange(N)/float(Fs), df.loc[n]) # по оси времени секунды!
plt.xlabel(u'Время, нc') # подпись оси х
plt.ylabel(u'Напряжение, мВ')# ось y
plt.title(u'Сигнал из файла')# название графика
plt.grid(True)
plt.show()
# rfftfreq возвращает частоты для выходных массивов функций fft
plt.stem(rfftfreq(N, 1./Fs), np.abs(spectrum)/N, use_line_collection=True, basefmt='C0')
# построение спектра
plt.xlabel(u'Частота, МГц')
plt.ylabel(u'Напряжение, мВ')
plt.title(u'Спектр')
plt.grid(True) #активация сетки
plt.show() #показ графика
#Сглаживание сигнала и фильтрация
def but(n):
plt.plot(t, output1, label='Отфильтрованный сигнал')
plt.plot(np.arange(N)/float(Fs), df.loc[n]) # по оси времени секунды!
plt.step(t, output1)# дискретизация по времени
plt.stem(t, output1)# квантование по уровню
plt.xlabel(u'Время, нc') # подпись оси х
plt.ylabel(u'Напряжение, мВ')# ось y
plt.legend(framealpha=1, shadow=True)
plt.grid(alpha=0.25)
plt.show()
if __name__ == "__main__":
df = pd.read_csv('1.csv', sep=",", usecols= [0,1,2,3,4,5,6,7,8,9]) #прочтение файла csv
Fs = 141*10**6
t = np.arange(10)/Fs #дискреты времени
N = 10 #количество точек
n = int(input("Номер сигнала: "))
fc = 20*10**6 # частота среза фильтра
w = fc/(Fs/2) # нормирование частоты
sos = butter(2, w, 'low', output= 'sos')
output1 = sosfiltfilt(sos, df.loc[n])
csv(n)
but(n)
Файл с сигналами 1.csv: https://drive.google.com/file/d/1GiFJWky6IfLhjbJlBbS7TDcGIHFErqyo/view?usp=sharing
Ответы (1 шт):
Автор решения: Azich
→ Ссылка
В строке нужно указать вывод значений массива
output1 = sosfiltfilt(sos, df.values[n;:])
Было до этого df.loc[n] - это неправильно.