2013-04-08 3 views
1

У меня есть сигнал, который отбирается со скоростью 10 000 Гц, и мне нужно пересчитать его до 4 000 Гц. В MATLAB я использую модель simulink с тремя простыми блоками: «Из рабочей области» с заданным временем выборки (0,0001 с) -> «Переход скорости» с заданным временем выборки вывода 0,00025 с -> «В рабочее пространство» для сохранения выходных данных. (Один блок перехода скорости я вижу «Нет Op»).Как реализовать «переход скорости» Matlab (в C#)

Я думал, что то же самое можно сделать с помощью функций Matlab, таких как «interp1», чтобы интерполировать данные, но не повезло. Я пробовал все, и все же я не знаю, как реализовать ту же функциональность, что и «переход скорости».

Мне нужно записать эту передискретизацию данных в C#, и мой вопрос: что это за синтаксис этого симулянта, который передает данные с одной частоты дискретизации на другую? Или как еще я могу получить эффект, который мне нужен?

Спасибо, КП

+0

Это зависит от того, нужна ли вам интерполяция или нет. Если нет, вы можете просто взять эквидистантные образцы из матрицы 10 кГц и поместить их в матрицу 4 кГц. –

+0

Предположим, что мне не нужна интерполяция. Итак, как бы я это сделал? – kamilkp

ответ

1

Кажется, что блок Rate Transition не выполняет никакой интерполяции. Он ведет себя как удержание нулевого порядка, когда частота дискретизации выше на входе, чем на выходе. Таким образом, вы можете попробовать это:

% Sampling frequency 
Fs1 = 10e3; 
Fs2 = 4e3; 

% Load your data 
y = load('yourdata'); %y=sin(0:1/Fs1:1); 
Ttime = (length(y)-1)*(1/Fs1); 

% X-Axis 
x = 0:1/Fs1:Ttime; 
xi = 0:1/Fs2:Ttime; 

% Zero-order hold 
yi = zeros(length(xi),1); 
jj = 1; 
xi(1) = x(1); 
for ii=2:length(y) 
    % Update value 
    if (x(ii)>=xi(jj)), 
     yi(jj) = y(ii-1); 
     jj = jj+1; 
    end 
end 

% Plot 
figure 
hold on 
scatter(x,y,'b'); 
scatter(xi,yi,'r'); 
hold off 
legend('Fs=10k','Fs=4k') 

Единственная модификация с предыдущим кодом, чтобы оценить уг (ось у интерполяции) от удержания нулевого порядка.

+0

Вот и все. Большое спасибо!! – kamilkp

1

Вы можете интерполировать таким образом:

% Sampling frequency 
Fs1 = 10e3; 
Fs2 = 4e3; 

% Load your data 
y = load('yourdata'); %y=sin(0:1/Fs1:1); 
Ttime = (length(y)-1)*(1/Fs1); 

% X-Axis 
x = 0:1/Fs1:Ttime; 
xi = 0:1/Fs2:Ttime; 

% Interpolate 
method = 'cubic'; 
yi = interp1(x,y,xi,method); 

% Plot 
figure 
hold on 
scatter(x,y,'b'); 
scatter(xi,yi,'r'); 
hold off 
legend('Fs=10k','Fs=4k') 

Основной шаг 'interp1', который выполняет один-размер интерполяции.

+0

Нет. Это было первое, что я пробовал, но выходные векторы отличаются. Я могу предоставить модель simulink и мои данные. – kamilkp

+0

Не зная, что такое «переход на курс» на самом деле, это, пожалуй, самое лучшее, что вы можете сделать и должно быть вполне адекватным. Документы на сайте Mathworks (http://www.mathworks.com/help/simulink/slref/ratetransition.html) не особенно освещают. –

+0

Ну, я знаю ... Но у меня есть алгоритм, который работает с этими повторно дискретируемыми данными, и его точность падает, когда я перехожу от метода передискретизации «переход скорости» к interp1. – kamilkp

Смежные вопросы