Задача интерполировать сигнал, повысив частоту дискретизации в 2 раза.
Матлаб имеет функцию dsp.FIRHalfbandInterpolator.
Используем ее.
Код: Выделить всё
clear; close all; clc;
%% Алгоритм
Fs = 6400;
order = 100;
halfbandInterpolator = dsp.FIRHalfbandInterpolator('SampleRate',Fs, ...
'Specification','Filter order and transition width', ...
'FilterOrder',order,'TransitionWidth', Fs/4);
fvtool(halfbandInterpolator,'Fs',2*Fs,'Color','white');
num = coeffs(halfbandInterpolator);
T =0.1;
t1 = 0 : 1/Fs : T - 1/Fs;
t2 = 0 : 1/2/Fs : T - 1/2/Fs;
sig = sin(2*pi*51 * t1);
refSig = sin(2*pi*51 * t2);
zeroAddSig = reshape([sig; zeros(1,length(sig))], [1 2*length(sig)]);
filteredSig = filter(num.Numerator, 1, zeroAddSig);
%% Результаты
delay = order/2;
figure();
stem(t1(1:end-delay), sig(1:end-delay), '*');
hold on; stem(t2(1:end-delay), zeroAddSig(1:end-delay), 'o');
hold on; stem(t2(1:end-delay), filteredSig(delay+1:end), '.');
legend('Исходный сигнал', 'Сигнад разбавленный 0', 'Отфильтрованный сигнал');
figure();
plot(abs(refSig(1:end-delay) - filteredSig(delay+1:end)), '.');
ylabel('Error');
Например, порядок фильтра.
Какими ограничениями необходимо задаться для его "оптимального" выбора?
А ширина переходной полосы?
Вроде бы, чем шире переходная полоса, тем меньше искажения в полосе пропускания, т.е. необходимо ее расширять пока не упремся в наивысшую гармонику сигнала?
Хотелось бы еще узнать об оптимальной реализации такого фильтра (каждый 2й коэффициент фильтра ноль).
Возможно, есть некий шаблон, например на C, функции фильтрации ?