【问题标题】:Save samples that repeat every 300 ms保存每 300 毫秒重复一次的样本
【发布时间】:2019-10-24 10:01:42
【问题描述】:

我想对音频信号进行采样。我有一个 5 秒长的 wav 文件。我想每 300 毫秒保存一次样本。

我在 MATLAB 中使用函数audioread 读取文件中包含的样本,这是我的代码:

[signal,fs]=audioread('file.wav');

dt = 1/fs;
N = length(signal);
t = 0:dt:(N-1)*dt;

plot(t,signal)
ms=t*1000;

如何保存每 300 毫秒重复一次的数组样本?

【问题讨论】:

    标签: matlab loops save frame milliseconds


    【解决方案1】:

    假设您的wav 文件的采样率为fs = 44100(这很常见),即每秒有44100 个样本。现在,您希望每个0.3 s 都有一个样本。您必须根据原始采样率计算要“跳过”的相应样本数,即在这种情况下为skip = 0.3 * fs = 13230。现在,您可以简单地访问原始signal 中的每个skip'th 元素(以及时间间隔t)。

    这里有一些代码来完成这项工作,并可视化上面的内容:

    % Artificial data
    signal = sin(linspace(0, 2*pi, 5 * 44100));
    fs = 44100;
    dt = 1 / fs;
    N = length(signal); 
    t = 0:dt:(N-1)*dt; 
    
    % "Re-sampling" parameters
    dt_new = 0.3; 
    skip = dt_new * fs;
    
    % Extract every skip'th value from original time interval and signal
    t_new = t(1:skip:end).'
    signal_new = signal(1:skip:end);
    
    % Some visualization
    figure(1);
    hold on;
    plot(t, signal);
    plot(t_new, signal_new, 'r.', 'MarkerSize', 15);
    hold off;
    

    我们得到如下输出,原始信号为蓝色,红色点为每个0.3 s处的样本:

    如果您查看t_new,您会发现,采样点与您想要的0.3 s 间隔完全匹配:

    t_new =
         0.00000
         0.30000
         0.60000
         0.90000
         1.20000
         1.50000
         1.80000
         2.10000
         2.40000
         2.70000
         3.00000
         3.30000
         3.60000
         3.90000
         4.20000
         4.50000
         4.80000
    

    希望有帮助!

    编辑:信号处理工具箱中还有一个resample 函数。我不确定这个函数在这里是否有用,因为新的采样率是fs_new = 1 / 0.3 = 3.3333,但resample 只接受整数。也许,还有另一个更复杂的(工具箱)功能可以自动完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多