Передискретизация неоднородно выбранных сигналов

В этом примере показано, как передискретизировать неоднородно произведенные сигналы к новому универсальному уровню. Это показывает, как применить пользовательский фильтр на нерегулярно выборочные данные, чтобы уменьшать искажение. Это также показывает, как использовать удаление тренда, чтобы удалить переходные процессы в запуске и в конце сигнала.

Передискретизация неоднородно выбранных сигналов к желаемому уровню

resample функция позволяет вам преобразовывать неоднородно произведенный сигнал в новый универсальный уровень.

Создайте синусоиду на 500 Гц, произведенную нерегулярно на уровне приблизительно 48 кГц. Мы симулируем неисправность путем добавления случайных значений в универсальный вектор.

rng default
nominalFs = 48000;
f = 500;
Tx = 0:1/nominalFs:0.01;
irregTx = sort(Tx + 1e-4*rand(size(Tx)));
x = sin(2*pi*f*irregTx);
plot(irregTx,x,'.')

Чтобы передискретизировать неоднородно произведенный сигнал, можно вызвать resample с входом временного вектора.

Следующий пример преобразует наш исходный сигнал в универсальный уровень на 44,1 кГц.

desiredFs = 44100;
[y, Ty] = resample(x,irregTx,desiredFs);
plot(irregTx,x,'.-', Ty,y,'o-')
legend('Original','Resampled')
ylim([-1.2 1.2])

Вы видите, что наш передискретизируемый сигнал имеет ту же форму и размер как исходный сигнал.

Выбор метода интерполяции

Алгоритм преобразования в resample работает лучше всего, когда входные выборки максимально близко к расположенному с равными интервалами, таким образом, это поучительно, чтобы наблюдать то, что может произойти, когда раздел входных выборок отсутствует в выборочных данных.

Следующий пример отмечает второй гребень входной синусоиды, и примените передискретизацию.

irregTx(105:130) = [];
x = sin(2*pi*f*irregTx);
[y, Ty] = resample(x,irregTx,desiredFs);

plot(irregTx,x,'. ')
hold on
plot(Ty,y,'.-')
hold off
legend('Original','Resampled')
ylim([-1.2 1.2])

Недостающий сегмент соединяется линейной интерполяцией. Линейная интерполяция является методом по умолчанию, используемым resample функция, чтобы передискретизировать неоднородно выборочные данные.

В некоторых случаях, где у вас есть недостающие данные или большие разрывы в вашем входе, можно восстановить некоторые недостающие данные путем выбора различного метода интерполяции.

Для малошумящего, сигналов низкой пропускной способности, сплайны могут быть очень эффективными, когда используется восстановить исходный сигнал. Чтобы использовать кубический сплайн во время передискретизации, предоставьте метод интерполяции 'сплайна':

[y, Ty] = resample(x,irregTx,desiredFs,'spline');

plot(irregTx,x,'. ')
hold on
plot(Ty,y,'.-')
hold off
legend('Original','Resampled using ''spline''')
ylim([-1.2 1.2])

Управление сеткой интерполяции

По умолчанию, resample создает промежуточную сетку, которая является близким рациональным приближением отношения между желаемой частотой дискретизации и средней частотой дискретизации сигнала.

Если раздел ваших входных выборок содержит высокочастотные компоненты, можно управлять интервалом промежуточной сетки путем выбора целочисленных коэффициентов, p и q, выбрать это рациональное отношение.

Исследуйте переходной процесс underdampened фильтра второго порядка, который колеблется на уровне приблизительно 3 Гц:

w = 2*pi*3;
d = .1002;
z = sin(d);
a = cos(d); 

t = [0:0.05:2 3:8];

x = 1 - exp(-z*w*t).*cos(w*a*t-d)/a;
plot(t,x,'.-')

Переходной процесс производится на высоком показателе, где он колеблется и под низкий процент, где это не.

Теперь передискретизируйте сигнал на уровне 100 Гц только с помощью настроек по умолчанию:

Fs = 100;
[y, Ty] = resample(x,t,Fs);
plot(t,x,'. ')
hold on
plot(Ty,y)
hold off
legend('Original','Resampled (default settings)')

Конверт колебания в начале формы волны ослабляется и колеблется более медленно, чем исходный сигнал.

resample, по умолчанию, интерполирует к сетке расположенных с равными интервалами интервалов, которые соответствуют средней частоте дискретизации входного сигнала.

avgFs = (numel(t)-1) /(t(end)-t(1))
avgFs = 5.7500

Частота дискретизации сетки должна быть выше, чем дважды самая большая частота, которую вы хотите измерить. Частота дискретизации сетки, 5,75 выборок в секунду, ниже частоты дискретизации Найквиста, 6 Гц, звонящая частота.

Чтобы заставить сетку иметь более высокую частоту дискретизации, можно предоставить целочисленные параметры, p и qпередискретизация настраивает частоту дискретизации сетки к Q*Fs/P, интерполирует сигнал, и затем применяет его внутренний конвертер частоты дискретизации (сверхдискретизировавший P и прореживающий Q), чтобы восстановить желаемую частоту дискретизации, Использование Фс rat выбрать p и q.

Поскольку вызов колебания составляет 3 Гц, задайте сетку с частотой дискретизации 7 Гц, которая немного выше, чем уровень Найквиста. Высота счетов на 1 Гц на дополнительное содержимое частоты из-за затухающего экспоненциального конверта.

Fgrid = 7;
[p,q] = rat(Fs/Fgrid)
p = 100
q = 7
[y, Ty] = resample(x,t,Fs,p,q);
plot(t,x,'.')
hold on
plot(Ty,y)
hold off
legend('Original','Resampled (custom P and Q)')

Определение фильтра сглаживания

В следующем примере можно просмотреть выход цифрового преобразователя, который измеряет установку дросселя на механизме самолета. Установка дросселя неоднородно производится о номинальном уровне 100 Гц. Мы попытаемся передискретизировать этот сигнал на универсальном уровне на 10 Гц.

Вот выборки нашего исходного сигнала.

load engineRPM
plot(t,x,'.')
xlabel('Time (s)')
ylabel('RPM')

Наш сигнал квантуется. Теперь масштабируйте в возрастающую область во временном интервале от 20 секунд до 23 секунд:

plot(t,x,'.')
xlim([20 23])

Сигнал медленно варьируется в этой области. Это позволяет вам удалять часть шума квантования при помощи фильтра сглаживания в resampler.

desiredFs = 10;
[y,ty] = resample(x,t,desiredFs);

plot(t,x,'.')
hold on
plot(ty,y,'.-')
hold off
xlabel('Time')
ylabel('RPM')
legend('Original','Resampled')
xlim([20 23])

Это работает обоснованно хорошо. Однако передискретизируемый сигнал может сглаживаться далее путем обеспечения resample фильтр с низкой частотой среза.

Во-первых, установите интервал сетки быть о нашей номинальной частоте дискретизации на 100 Гц.

nominalFs = 100;

Затем определите разумный p и q получить желаемый уровень. Поскольку номинальный уровень составляет 100 Гц, и наш желаемый уровень составляет 10 Гц, необходимо десятикратно уменьшить 10. Это эквивалентно установке p к 1 и установка q к 10.

p = 1;
q = 10;

Можно предоставить resample с вашим собственным фильтром. Чтобы иметь соответствующее временное выравнивание, фильтр должен иметь нечетную длину. Длина фильтра должна быть несколько раз больше, чем p или q (какой бы ни больше). Установите частоту среза быть 1 / q желаемое сокращение и затем умножает получившиеся коэффициенты на p.

% ensure an odd length filter
n = 10*q+1;

% use .25 of Nyquist range of desired sample rate
cutoffRatio = .25;

% construct lowpass filter 
lpFilt = p * fir1(n, cutoffRatio * 1/q);

% resample and plot the response
[y,ty] = resample(x,t,desiredFs,p,q,lpFilt);

plot(t,x,'.')
hold on
plot(ty,y)
hold off
xlabel('time')
ylabel('RPM')
legend('Original','Resampled (custom filter)','Location','best')
xlim([20 23])

Удаление эффектов конечной точки

Теперь уменьшите масштаб, чтобы просмотреть наш исходный сигнал. Обратите внимание на то, что существует значительное смещение в конечных точках.

plot(t,x,'.',ty,y)
xlabel('time')
ylabel('RPM')
legend('original','resampled (custom filter)','Location','best')

Эти артефакты возникают потому что resample принимает, что сигнал является нулем вне границ сигнала. Чтобы уменьшать эффект этих разрывов, вычтите от линии между конечными точками сигнала, выполните передискретизацию, и затем добавьте назад линию на исходную функцию. Можно сделать это путем вычисления наклона и смещения линии между первой и последней выборкой, и использования polyval создать линию, чтобы вычесть.

% compute slope and offset (y = a1 x + a2)
a(1) = (x(end)-x(1)) / (t(end)-t(1));
a(2) = x(1);

% detrend the signal
xdetrend = x - polyval(a,t);
plot(t,xdetrend)

Детрендированный сигнал теперь имеет обе из своих конечных точек около нуля, который уменьшает введенные переходные процессы. Вызовите resample и затем добавьте назад тренд.

[ydetrend,ty] = resample(xdetrend,t,desiredFs,p,q,lpFilt);

y = ydetrend + polyval(a,ty);

plot(t,x,'.',ty,y)
xlabel('Time')
ylabel('RPM')
legend('Original','Resampled (detrended, custom filter)','Location','best')

Сводные данные

В этом примере показано, как использовать resample преобразовывать однородно и неоднородно произведенные сигналы к фиксированной процентной ставке.

Дополнительные материалы для чтения

Для получения дополнительной информации о восстановлении расположенных с неоднородными интервалами выборок с пользовательскими сплайнами можно консультироваться с документацией Curve Fitting Toolbox™.