获取音频文件中的句点

时间:2014-03-20 11:29:36

标签: matlab audio signal-processing

我有一个音频文件,它表示电机以2500rpm运行的声音我的目的是得到这个信号的周期,所以我可以自动告诉电机速度是多少。要做到这一点,我采取信号的一部分并运行得到它自相关,跳跃,这将告诉信号的时期!但我只是没有得到它: 这是我的代码的一部分:

clear;
clc;
[x0,Fs] = audioread('_2500.wav');
x= x0(1:2000,1);
xc = xcorr(x);
clf; 
subplot(3,1,1);
plot(x);

subplot(3,1,2);
plot(xc);

[peaks,locs] = findpeaks(xc);
hold on 
subplot(3,1,3)
plot(xc(locs),'ro');

以下是情节:

image

我应该如何考虑采样频率,即:44100?

3 个答案:

答案 0 :(得分:2)

您可以使用信号的自相关或FFT来查找最大值:

% Parameters
Fc = 1e1;
Fs = 1e3;

% Signal
t = 0:1/Fs:1;
x = sin(2*pi*Fc*t);

% FFT
Y = abs(fft(x));
[~,I] = max(Y(1:floor(end/2)));

% Frequency and period
F = I-1;
T = 1/F;

% Plot
figure; 
subplot(2,1,1); plot(t,x);
subplot(2,1,2); plot(Y);
disp(['The frequency is ',mat2str(F),'Hz, and the period is ',mat2str(T),'sec.']);

Thisthis帖子相关。

答案 1 :(得分:0)

要从自相关函数xc转到基频估计值,请执行以下操作:

fs = 44100; % Unit: Hz
xc = xc((length(xc) - 1) / 2 + 1: end); % Get the half on the positive time axis. 
[~, pidx] = findpeaks(xc);
period = (pidx(1) - 1) / fs;
F0 = 1 / period; % Estimated fundamental frequency. 

请注意,还有其他可能更强大的基频/音调估算算法。对“基本频率估计”或“音高估计”进行谷歌学者搜索将引导您进行一些好的评论。

答案 2 :(得分:0)

使用“findpeaks”函数找到所有峰值,现在计算每个峰值之间的差异

P=diff(locs)

您的期限可以是:

max(P)

在22050采样率下,250hz正弦值约为88,如果你做(Fs/Period) == Frequency

,你信号的频率相当于句号

如果您知道信号的频率,您可以找到Fs/Frequency

的句号