Можем ли мы нарисовать график цифровой формы волны с помощью Pyplot в python или Matlab?

Я пытаюсь нарисовать график формы сигнала цифрового сигнала для таких битов, как 01010101010101, используя pyplot в python, например

http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Differential_manchester_encoding.svg/600px-  Differential_manchester_encoding.svg.png

Возможно ли это с Pyplot?


person maths    schedule 17.11.2013    source источник
comment
это можно сделать с помощью plot, но это требует небольшой настройки входных координат: всякий раз, когда происходит изменение сигнала, к последовательности следует добавлять дополнительную точку с тем же временем *x координатой) и соответствующим значением ноль-единица для координата у. У меня сейчас нет открытого Matlab, чтобы предоставить подробное решение, но этой информации должно быть достаточно для его реализации.   -  person Shai    schedule 18.11.2013
comment
В Matlab: лестницы   -  person A. Donda    schedule 18.11.2013


Ответы (4)


Как отмечает tcaswell, правильно использовать функцию step. Вот пример, который приближается к вашему заданному сюжету:

import matplotlib.pyplot as plt
import numpy as np

def my_lines(ax, pos, *args, **kwargs):
    if ax == 'x':
        for p in pos:
            plt.axvline(p, *args, **kwargs)
    else:
        for p in pos:
            plt.axhline(p, *args, **kwargs)

bits = [0,1,0,1,0,0,1,1,1,0,0,1,0]
data = np.repeat(bits, 2)
clock = 1 - np.arange(len(data)) % 2
manchester = 1 - np.logical_xor(clock, data)
t = 0.5 * np.arange(len(data))

plt.hold(True)
my_lines('x', range(13), color='.5', linewidth=2)
my_lines('y', [0.5, 2, 4], color='.5', linewidth=2)
plt.step(t, clock + 4, 'r', linewidth = 2, where='post')
plt.step(t, data + 2, 'r', linewidth = 2, where='post')
plt.step(t, manchester, 'r', linewidth = 2, where='post')
plt.ylim([-1,6])

for tbit, bit in enumerate(bits):
    plt.text(tbit + 0.5, 1.5, str(bit))

plt.gca().axis('off')
plt.show()

введите здесь описание изображения

person Bas Swinckels    schedule 17.11.2013

Просто используйте plt.step

plt.step(x, y, where='pre')

См. документы и Linestyle в функции шага matplotlib и Пошаговая функция в matplotlib для примеров.

person tacaswell    schedule 17.11.2013

Вот моя попытка. Уловка, которую я использовал, состоит в том, чтобы удвоить каждую координату x и y с помощью np.repeat, а затем сместить их на 1, чтобы сгенерировать координаты каждого угла. Дайте мне знать, если это нуждается в лучшем объяснении. Вы можете добавить линии сетки с помощью plt.grid(True).

import numpy as np
import matplotlib.pyplot as plt

data = [1, 0, 0, 1, 1, 0, 1, 0]
xs = np.repeat(range(len(data)), 2)
ys = np.repeat(data, 2)
xs = xs[1:]
ys = ys[:-1]
plt.plot(xs, ys)
plt.ylim(-0.5, 1.5)
plt.show()

введите здесь описание изображения

person YXD    schedule 17.11.2013

Поскольку в вашем заголовке также указано «в Matlab», используйте stairs :

y = [0 1 0 1 0 1 0 1 0 1 0 1 0 1]; % define values
stairs(0:length(y)-1,y) % do the plotting
ylim([-.5 1.5]) % adjust axis limits

введите здесь описание изображения

person Luis Mendo    schedule 17.11.2013