Датчики могут возвращать отсеченные показания, если данные превышают заданную точку насыщения. Чтобы восстановить показания, можно подогнать многочлен через точки, смежные с насыщенными интервалами. Запишите функцию, выполняющую реконструкцию, и интегрируйте ее в анализатор сигналов.
Генерация трехканального сигнала с частотой 1 кГц в течение 14 секунд. Сигнал имеет несколько пиков различных размеров и форм. Датчик, считывающий сигнал, насыщается при 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. Перетащите каждый исходный и насыщенный канал на собственный экран.

Запишите функцию, использующую многочлен для восстановления пиков сигнала:
Первый входной аргумент, x, - входной сигнал. Этот аргумент должен быть вектором и обрабатываться как один канал.
Второй входной аргумент, tIn, - вектор значений времени. Вектор должен иметь ту же длину, что и сигнал. Если входной сигнал не содержит временной информации, функция считывает этот аргумент как пустой массив.
Использовать varargin для указания дополнительных входных аргументов. Если у вас нет дополнительных входных аргументов, вы можете опустить varargin. Введите дополнительные аргументы в виде упорядоченного списка, разделенного запятыми, на вкладке Предварительный процесс.
Первый выходной аргумент, y, является предварительно обработанным сигналом.
Второй выходной аргумент, tOut, - вектор выходных значений времени. Если входной сигнал не содержит временной информации, tOut возвращается как пустой массив.
Для реализации алгоритма можно использовать любую функцию MATLAB ® или 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) щелкните ▼ предварительной обработки и выберите децип.
На появившейся вкладке Предварительная обработка щелкните Предварительная обработка.
Убедитесь, что функция предварительной обработки работает, когда сигналы имеют временную информацию.
Выбрать sig и sigsat в таблице Сигнал (Signal). Не выбирайте отдельные каналы.
На вкладке Analyzer (Анализатор) щелкните Time Values (Значения времени), выберите Sample Rate and Start Time, и указать fs как частота выборки.
Сигнал в верхней панели, включая реконструированные области, имеет временную информацию.

Убедитесь, что функция работает при указании дополнительных входных данных.
Выберите второй и третий каналы насыщенного сигнала в таблице Signal.
На закладке Предварительная обработка введите 8 в поле Аргументы и нажмите Препроцесса. Функция предварительной обработки использует многочлен степени 8 для восстановления насыщенных областей.
