保存每300毫秒重复的样本

问题描述 投票:0回答:1

我想对音频信号进行采样。我有一个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个回答
0
投票

假设您的wav文件的采样率为fs = 44100(这是很常见的),即您每秒具有44100个样本。现在,您想要每个0.3 s有一个样本。您必须相对于原始采样率(在这种情况下为skip = 0.3 * fs = 13230)计算要“跳过”的相应采样数。现在,您只需访问原始skip中的每个signal元素(以及时间间隔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处的样本:

Output

[如果您查看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

希望有帮助!

EDIT: Signal Processing Toolbox中还有一个resample功能。我不确定此功能是否有用,因为新的采样率将为resample,但fs_new = 1 / 0.3 = 3.3333仅接受整数。也许,还有另一个更复杂的(工具箱)功能可以自动完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.