В этом примере показано, как использовать функциональный преобразователь, чтобы сгенерировать произвольную функцию формы волны на уровне 1 кГц и данных записи одновременно, с помощью канала аналогового входа. Область значений выходного напряжения исходящего сигнала-5.0 к +5.0 вольтам. Этот пример использует основанный на сеансе интерфейс с Аналоговым оборудованием Открытия Digilent.
Узнайте устройства Digilent, соединенные к вашей системе с помощью daq.getDevices
daq.getDevices()
ans = Data acquisition devices: index Vendor Device ID Description ----- ----------- --------- ----------------------------------------------------------------- 1 digilent AD1 Digilent Inc. Analog Discovery Kit Rev. C 2 directsound Audio0 DirectSound Primary Sound Capture Driver 3 directsound Audio1 DirectSound Primary Sound Driver
s = daq.createSession('digilent')
s = Data acquisition session using Digilent Inc. hardware: Will run for 1 second (10000 scans) at 10000 scans/second. No channels have been added.
Добавьте канал функционального преобразователя с ID устройства AD1
и ID канала 1
. Установите тип формы волны на Arbitrary
.
fgenCh = addFunctionGeneratorChannel(s, 'AD1', 1, 'Arbitrary')
fgenCh = Data acquisition arbitrary waveform generator '1' on device 'AD1': WaveformData: [4096x1 double] Range: -5.0 to +5.0 Volts TerminalConfig: SingleEnded Gain: 1 Offset: 0 Frequency: 4096 WaveformType: Arbitrary FrequencyLimit: [0.0001 25000000.0] Name: '' ID: '1' Device: [1x1 daq.di.DeviceInfo] MeasurementType: 'Voltage'
Функциональный преобразователь производит периодические выходные параметры путем повторной генерации содержимого его буфера (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)); A = 5; waveform = A*waveform./max(abs(waveform)); waveform(end) = [];
fgenCh.WaveformData = waveform;
1 KHz
frate = 1000; fgenCh.Frequency = frate;
Добавьте канал аналогового входа с ID устройства AD1
и ID канала 1
. Установите тип измерения на Voltage
.
aiCh = addAnalogInputChannel(s, 'AD1', 1, 'Voltage')
aiCh = Data acquisition analog input voltage channel '1' on device 'AD1': Coupling: DC TerminalConfig: Differential Range: -25 to +25 Volts Name: '' ID: '1' Device: [1x1 daq.di.DeviceInfo] MeasurementType: 'Voltage'
Получите данные на более высоком уровне, чем самая высокая частота в сгенерированной форме волны (сверхдискретизируйте фактором 50),
oversamplingratio = 50; nyquistrate = 2 * frate; s.Rate = oversamplingratio * nyquistrate;
s.DurationInSeconds = 3;
[data, timestamps] = startForeground(s);
% Plot parameters k = 5; period = 1/frate; numperiods = k * period; % Desired waveform wavedesired = repmat(waveform', k, 1); tsamples = linspace(0, numperiods, k * buffersize)'; fig = figure; 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)'); axis([0 numperiods -A A]) % Acquired waveform subplot(312) plot(timestamps, data); xlabel('Time (seconds)'); ylabel('Voltage (Volts)'); title('Acquired Waveform'); axis([0 numperiods -A A]) % Frequency-Domain Plot (using fft) L = 2 * oversamplingratio * buffersize; Fs = s.Rate; NFFT = 2^nextpow2(L); Y = fft(data, NFFT)/L; f0 = (Fs/2) * linspace(0, 1, NFFT/2 + 1); plotScaleFactor = 12; plotRange = NFFT / 2; % Plot is symmetric about n/2 plotRange = floor(plotRange / plotScaleFactor); Yplot = Y(1:plotRange); fplot = f0(1:plotRange); % 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