Используйте каналы генератора функций, чтобы сгенерировать произвольную функцию 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]);