我有一个音频文件,它表示电机以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');
以下是情节:
我应该如何考虑采样频率,即:44100?
答案 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.']);
答案 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