Получение и анализ шумных тактовых сигналов

Этот пример показывает, как получить тактовые сигналы и анализировать переходы, импульсы и вычислительные метрики, включая время нарастания, время спада, скорость нарастания, перерегулирование, недорегулирование, ширину импульса и коэффициент заполнения. Этот пример использует Data Acquisition Toolbox в сочетании с Signal Processing Toolbox.

Чтобы настроить сбор, используйте Data Acquisition Toolbox. Используйте функции статистики и измерения в Signal Processing Toolbox, чтобы проанализировать сигнал данных.

Создайте DataAcquisition и получите тактовый сигнал

Использование daq создание DataAcquisition и addinput добавить канал из NI-9205 National Instruments ® с идентификатором 'cDAQ1Mod1'.

dq = daq("ni");
addinput(dq,"cDAQ1Mod1","ai0","Voltage");

По умолчанию DataAcquisition настроен на выполнение с частотой 1000 сканирований в секунду.

Измените скорость скана на 250000 сканирований в секунду.

dq.Rate = 250000;

Использование read для получения нескольких сканов в течение 2 мс.

[data, time] = read(dq, milliseconds(2), "OutputFormat", "Matrix");

Постройте график полученного тактового сигнала (обратите внимание, что он перегружен).

plot(time, data)
xlabel('Time (s)')
ylabel('Voltage (V)')

Оценка уровней состояния

Использование statelevels без выходного аргумента для визуализации уровней состояний в гистограмме.

statelevels(data)
ans =

    0.0138    5.1848

Вычисленная гистограмма разделена на две области равных размеров между первым и последним интервалом. Режим каждой области гистограммы возвращается как расчетное значение уровня состояния в командном окне.

Используйте необязательные входные параметры, чтобы задать количество интервалов гистограммы, границы гистограммы и метод оценки уровня состояния.

Время нарастания измерений, Времени спада и Скорости нарастания

Использование risetime без выходного аргумента, чтобы визуализировать время нарастания положительных ребер.

risetime(data,time)
ans =

   1.0e-04 *

    0.5919
    0.8344
    0.7185
    0.8970
    0.6366

Уровни ссылки по умолчанию для вычисления времени нарастания и времени спада заданы на уровне 10% и 90% от амплитуды формы волны.

Измерьте время спада путем определения пользовательских ссылок и уровней состояний.

falltime(data,time,'PercentReferenceLevels',[20 80],'StateLevels',[0 5])
ans =

   1.0e-04 *

    0.4294
    0.5727
    0.5032
    0.4762

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

sr = slewrate(data(1:100), dq.Rate)
sr =

   7.0840e+04

Анализируйте перерегулирование и недорегулирование

Получите новый заниженный синхросигнал.

[data, time] = read(dq, milliseconds(4), "OutputFormat", "Matrix");
plot(time, data)
xlabel('Time (s)')
ylabel('Voltage (V)')

Заниженные тактовые сигналы показывают перерегулирование. Перерегулирование выражается в процентах от различия между уровнями состояния. Перерегулирование может произойти сразу после ребра, в начале области аберрации после перехода. Это называется «постшут» перерегулированием. Измерьте перерегулирование с помощью overshoot.

overshoot(data(95:270),dq.Rate)
legend('Location','NorthEast')
ans =

    4.9451
    2.5399

Перерегулирование может также происходить непосредственно перед ребром, в конце области аберрации перед переходом. Это называется «preshoot» перерегулирование.

Занижение может происходить в областях до аберрации и после аберрации и выражается в процентах от различия между уровнями состояния. Измерьте подрегулирование необязательными входными параметрами, задающими область для измерения аберраций.

undershoot(data(95:270),dq.Rate,'Region','Postshoot')
legend('Location','NorthEast')
ans =

    3.8499
    4.9451

Измерение ширины импульса и коэффициента заполнения

Использование pulsewidth без выходного аргумента для визуализации подсвеченных ширин импульса.

pulsewidth(data, time, 'Polarity', 'Positive');

Это отображает импульсы положительной полярности. Выберите отрицательную полярность, чтобы увидеть ширины отрицательных полярных импульсов.

Использование dutycycle вычислить отношение ширины импульса к периоду импульса для каждого импульса положительной полярности или отрицательной полярности. Коэффициенты заполнения выражаются в процентах от периода импульса.

d = dutycycle(data,time,'Polarity','negative')
d =

    0.4979
    0.5000
    0.5000

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

pp = pulseperiod(data, time);

avgFreq = 1./mean(pp)
totalJitter = std(pp)
avgFreq =

    1.2500e+03


totalJitter =

   1.9866e-06