【问题标题】:Getting the Period in an audio file在音频文件中获取句点
【发布时间】:2014-04-27 05:12:17
【问题描述】:

我有一个音频文件,它代表以 2500rpm 运行的电机的声音,我的目标是获得这个信号的周期,这样我就可以自动判断电机的速度是多少。为此,我获取信号的一部分并运行 get it autocorrelation ,希望这会告诉信号的周期!但我就是不明白: 这是我的代码的一部分:

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?

【问题讨论】:

标签: matlab audio signal-processing


【解决方案1】:

您可以使用信号的自相关或 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 帖子是相关的。

【讨论】:

  • 它适用于已实现的 sin wav,但听,当我听到音频时,我听不懂,感谢您的帮助
【解决方案2】:

要从自相关函数 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. 

请注意,还有其他可能更强大的基频/音高估计算法。在“基本频率估计”或“音高估计”上进行谷歌学术搜索会导致您获得一些好评。

【讨论】:

    【解决方案3】:

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

    P=diff(locs)
    

    你的月经可以是:

    max(P)
    

    22050 采样率下 250hz 正弦的周期约为 88,如果您这样做(Fs/Period) == Frequency,您的信号频率在周期是等效的

    如果您知道信号的频率,您可以找到周期,只需执行Fs/Frequency

    【讨论】:

    • 我得到 251 ,怎么会是那个时期?
    • 你从哪里得到的?我有一个 2500rpm 的电机,这意味着 => f = 6,63 Hz!
    • 哇,对不起,它是 _2500.wav 我以为这是 250 hz 的标志,哈哈,如果你知道你的频率,你就可以知道周期 Fs/Frequency 的结果是什么??
    • 针对这种情况,不知道频率的,自己去查一下!
    • 当你不知道你需要做自相关的频率时,找到所有的峰值,计算每个峰值之间的差异,现在找到最大值,这个步骤可以告诉你周期
    猜你喜欢
    • 2022-12-05
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2023-03-14
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多