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

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

Обнаружение цифровых устройств

Обнаружение устройств 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

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

Добавьте канал генератора функций с идентификатором устройства AD1 и идентификатор канала 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"

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

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

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;

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

Добавьте аналоговый входной канал с идентификатором устройства AD1 и идентификатор канала 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]);