首页 文章

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

提问于
浏览
1

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

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

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

谢谢,KP

2 回答

  • 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轴内插) .

  • 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” .

相关问题