Датчики могут возвращать отсеченные показания, если данные больше заданной точки насыщения. Чтобы восстановить показания, можно подогнать полином через точки, примыкающие к насыщенным интервалам. Напишите функцию, которая выполняет реконструкцию и интегрирует ее в Signal Analyzer.
Сгенерируйте трехканальный сигнал, дискретизированный на частоте 1 кГц в течение 14 секунд. Сигнал имеет несколько peaks меняющихся размеров и форм. Датчик, который считывает сигнал, достигает 0.1 В.
fs = 1000; t = 0:1/fs:14-1/fs; sig = [chirp(t-1,0.1,17,2,'quadratic',1).*sin(2*pi*t/5); chirp(t-2,2,2,2.1,'quadratic',100).*exp(-(t-6.5).^2/20).*sin(2*pi*t*2); 0.85*besselj(0,5*(sin(2*pi*(t+1.5).^2/20).^2)).*sin(2*pi*t/9)]'; sigsat = sig; stv = 0.1; sigsat(sigsat >= stv) = stv;
Откройте Signal Analyzer и перетащите исходный сигнал и насыщенный сигнал в таблицу Signal. Перетащите каждый исходный и насыщенный канал на собственное отображение.
Напишите функцию, которая использует полином, чтобы восстановить peaks сигнала:
Первый входной параметр, x
, является входным сигналом. Этот аргумент должен быть вектором и рассматриваться как один канал.
Второй входной параметр, tIn
, является вектором значений времени. Вектор должен иметь ту же длину, что и сигнал. Если входной сигнал не имеет информации о времени, функция читает этот аргумент как пустой массив.
Использование varargin
для задания дополнительных входных параметров. Если у вас нет дополнительных входных параметров, можно опустить varargin
. Введите дополнительные аргументы в виде упорядоченного списка, разделенного запятыми, на вкладке «Предварительная обработка».
Первый выходной аргумент, y
, - предварительно обработанный сигнал.
Второй выходной аргумент, tOut
, является вектором выхода значений времени. Если входной сигнал не имеет информации о времени, tOut
возвращается как пустой массив.
Чтобы реализовать свой алгоритм, можно использовать любую функцию MATLAB ® или Signal Processing Toolbox™.
function [y,tOut] = declip(x,tIn,varargin) % Declip saturated signal by fitting a polynomial % Initialize the output signal y = x; % For signals with no time information, use sample numbers as abscissas if isempty(tIn) tOut = []; t = (1:length(x))'; else t = tIn; tOut = t; end % Specify the degree of the polynomial as an optional input argument % and provide a default value of 4 if nargin<3 ndx = 4; else ndx = varargin{1}; end % To implement your algorithm, you can use any MATLAB or Signal % Processing Toolbox function % Find the intervals where the signal is saturated and generate an % array containing the interval endpoints idx = find(x==max(x)); fir = [true;diff(idx)~=1]; ide = [idx(fir) idx(fir([2:end 1]))]; % For each interval, fit a polynomial of degree ndx over the ndx+1 points % before the interval and the ndx+1 points after the interval for k = 1:size(ide,1) bef = ide(k,1); aft = ide(k,2); intv = [bef-1+(-ndx:0) aft+1+(0:ndx)]; [pp,~,mu] = polyfit(t(intv),x(intv),ndx); y(bef:aft) = polyval(pp,t(bef:aft),[],mu); end end
Добавьте функцию к Signal Analyzer как пользовательскую функцию предварительной обработки. На вкладке Analyzer нажмите Preprocessing ▼ и выберите Add Custom Function. Введите имя функции и описание. Вставьте текст функции в появившееся окно редактора. Сохраните файл. Функция появится в галерее предварительной обработки.
Продемонстрировать, что созданная вами функция восстанавливает насыщенные области.
Выберите первый канал насыщенного сигнала в таблице Signal.
На вкладке Analyzer нажмите Preprocessing ▼ и выберите declip.
На появившейся вкладке Предварительная обработка нажмите кнопку Предварительная обработка.
Проверьте, что функция предварительной обработки работает, когда сигналы имеют информацию о времени.
Выберите sig
и sigsat
в таблице Сигнал. Не выбирайте отдельные каналы.
На вкладке Analyzer, нажмите Time Values, выберите Sample Rate and Start Time
, и задайте fs
как частота дискретизации.
Сигнал в верхней панели, включая восстановленные области, имеет информацию о времени.
Проверяйте, что функция работает, когда вы задаете необязательные входы.
Выберите второй и третий каналы насыщенного сигнала в таблице Signal.
На вкладке Предварительная обработка введите 8
в поле аргументы и нажмите Preprocess. Функция предварительной обработки использует полином степени 8, чтобы восстановить насыщенные области.