Датчики могут возвратить отсеченные показания, если данные больше, чем данная точка насыщения. Чтобы восстановить показания, можно соответствовать полиному через точки, смежные с влажными интервалами. Запишите функцию, которая выполняет реконструкцию, и интегрируйте ее в 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
. Введите дополнительные аргументы как упорядоченный список, разделенный запятыми во вкладке Preprocess.
Первый выходной аргумент, 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.
На вкладке Preprocessing, которая появляется, нажмите Preprocess.
Проверьте, что функция предварительной обработки работает, когда сигналы имеют информацию времени.
Выберите sig
и sigsat
в таблице Signal. Не выбирайте отдельные каналы.
На вкладке Analyzer нажмите Time Values, выберите Sample Rate and Start Time
, и задайте fs
как частота дискретизации.
Сигнал в верхней панели, включая восстановленные области, имеет информацию времени.
Проверяйте, что функция работает, когда вы задаете дополнительные входные параметры.
Выберите вторые и третьи каналы влажного сигнала в таблице Signal.
На вкладке Preprocessing введите 8
в поле Arguments и нажимают Preprocess. Функция предварительной обработки использует полином степени 8, чтобы восстановить влажные области.