如何实现Matlab“速率转换”(在C#中)

时间:2013-04-08 11:25:10

标签: c# matlab simulink resampling

我有一个以10 000 Hz的速率采样的信号,我需要将其重新采样到4 000 Hz。在MATLAB中,我使用带有三个简单块的simulink模型:“From Workspace”,具有指定的采样时间(0.0001 s) - > “速率转换”具有指定的输出采样时间0.00025秒 - > “To Workspace”保存输出数据。 (一个速率转换块我看到“No Op”)。

我认为可以使用Matlab函数(例如“interp1”)来完成同样的操作来插入数据但没有运气。我已经尝试了一切,但我仍然不知道如何实现“速率转换”具有的相同功能。

我需要在C#中重新采样这个数据,我的问题是:这个simulink的底层算法是什么将数据从一个采样频率移植到另一个采样频率?或者我怎么能得到我需要的效果呢?

谢谢, KP

2 个答案:

答案 0 :(得分: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'。

答案 1 :(得分: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')

前一代码的唯一修改是从零阶保持估计yi(y轴插值)。