Сгенерируйте произвольные периодические формы волны Используя аналоговое открытие Digilent

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

Узнайте устройства Digilent

Узнайте устройства Digilent, соединенные к вашей системе с помощью daqlist.

daqlist("digilent")
dq = daq("digilent")
ans =

  1×4 table

    DeviceID                     Description                            Model                  DeviceInfo       
    ________    _____________________________________________    ____________________    _______________________

     "AD1"      "Digilent Inc. Analog Discovery 2 Kit Rev. C"    "Analog Discovery 2"    [1×1 daq.di.DeviceInfo]


dq = 

DataAcquisition using Digilent Inc. hardware:

                     Running: 0
                        Rate: 10000
           NumScansAvailable: 0
            NumScansAcquired: 0
              NumScansQueued: 0
    NumScansOutputByHardware: 0
                   RateLimit: []

Show channels
Show properties and methods

Добавьте канал функционального преобразователя

Добавьте канал функционального преобразователя с ID устройства AD1 и ID канала 1. Установите тип формы волны на Arbitrary. Область значений напряжения выходного сигнала-5.0 к +5.0 вольтам.

ch_fgen = addoutput(dq, "AD1", "1", "Arbitrary");
ch_fgen.Name = "AD1_1_fgen"
ch_fgen = 

    Index     Type     Device    Channel    Measurement Type           Range                Name    
    _____    ______    ______    _______    ________________    ____________________    ____________

      1      "fgen"    "AD1"       "1"        "Arbitrary"       "-5.0 to +5.0 Volts"    "AD1_1_fgen"

Задайте сумму синусоид как Выходная форма волны

Функциональный преобразователь производит периодические выходные параметры путем повторной генерации содержимого его буфера (4 096 точек). Форма волны создается, чтобы заполнить этот буфер без повторения.

buffersize = 4096;
len = buffersize + 1;

f0 = 1;
f1 = 1 * f0;
f2 = 2 * f0;
f3 = 3 * f0;

waveform  = sin(linspace(0, 2*pi*f1, len)) + ...
            sin(linspace(0, 2*pi*f2, len)) + ...
            sin(linspace(0, 2*pi*f3, len));

waveform(end) = [];

Присвойте частоту формы волны данных и набора формы волны

frequency = 1000;
ch_fgen.WaveformData = waveform;
ch_fgen.Frequency = frequency;

Добавьте канал аналогового входа

Добавьте канал аналогового входа с ID устройства AD1 и ID канала 1. Установите тип измерения на Voltage.

ch_in = addinput(dq, "AD1", "1", "Voltage");
ch_in.Name = "AD1_1_in"
ch_in = 

    Index    Type    Device    Channel    Measurement Type          Range              Name   
    _____    ____    ______    _______    ________________    __________________    __________

      1      "ai"    "AD1"       "1"      "Voltage (Diff)"    "-25 to +25 Volts"    "AD1_1_in"

Задайте частоту развертки захвата

Получите данные в более высокой частоте развертки, чем самая высокая частота в сгенерированной форме волны (сверхдискретизация).

oversamplingratio = 50;
Fn = 2 * frequency;
Fs = oversamplingratio * Fn;
dq.Rate = Fs;

Сгенерируйте периодическую форму волны и запишите вход

data = read(dq, seconds(3));

Задайте параметры графика

k = 5;
width = 750;
height = 750;
period = 1/frequency;
numperiods = k * period;
maxamplitude = 3*ch_fgen.Gain;

wavedesired = repmat(waveform', k, 1);
tsamples = linspace(0, numperiods, k * buffersize)';

Задайте параметры БПФ

L = 2 * oversamplingratio * buffersize;
NFFT = 2^nextpow2(L);
Y = fft(data.AD1_1_in, NFFT)/L;
f0 = (Fs/2) * linspace(0, 1, NFFT/2 + 1);

Постройте формы волны

plotScaleFactor = 12;
plotRange = NFFT/2; % Plot is symmetric about NFFT
plotRange = floor(plotRange / plotScaleFactor);

Yplot = Y(1:plotRange);
fplot = f0(1:plotRange);

fig = figure;

% Plot Desired Waveform
subplot(311)
plot(tsamples, wavedesired);
xlabel('Time (seconds)');
ylabel('Voltage (Volts)');
title('Desired Waveform: sin(2\pi*1000t) + sin(2\pi*2000t) + sin(2\pi*3000t)');
xlim([0 numperiods]);
ylim([-maxamplitude maxamplitude]);

% Plot Acquired Waveform
subplot(312)
plot(data.Time, data.AD1_1_in);
xlabel('Time (seconds)');
ylabel('Voltage (Volts)');
title('Acquired Waveform');
xlim([seconds(0) seconds(numperiods)]);
ylim([-maxamplitude maxamplitude]);

% Plot Single-Sided Amplitude Spectrum
subplot(313)
stem(fplot, 2*abs(Yplot));
title('Single-Sided Amplitude Spectrum of Waveform')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
axis tight

% Make Graph Larger
outpos = get(fig, 'OuterPosition');
set(fig, 'OuterPosition', [outpos(1)-125 outpos(2)-375 width height]);