所以我有这个钢琴录音(.wav 格式)。我能够做一个FFT
整体记录并识别频率。
然而,根据我读过的一些文章,最好将 wav 文件分解为多个窗口,其中每个窗口都包含一个特定的音符。
为此,我需要首先绘制时域信号的“功率包络”(考虑音符平均能量概念),因此每个音符都会有一个增加和一个减少,并且可以通过检查局部最小值来确定音符开始。
这就是引入“窗口”的地方,其中每个窗口仅包含一个起始点,然后FFT
在每个窗口上执行。
我很难绘制功率范围并将其分解为窗户。希望得到一些帮助Matlab
为此编码。
我使用的代码非常简单:
[wave,fs] = wavread('c 音阶 fast.wav'); %将文件读入内存*/
%声音(波,fs); % 看看听起来像什么 */
波 = 波。*汉明(长度(波));
t = 0:1/fs:(长度(波)-1)/fs; %并得到采样频率*/
图(2);
subplot(2,1,1);
plot(t,wave);
title('Wave File');
ylabel('Amplitude');
xlabel('Length (in seconds)');
L = 长度(波);
NFFT = 2^nextpow2(L); % y 长度的 2 的下一个幂
Y = fft(波,NFFT)/L;
f = fs/2*linspace(0,1,NFFT/2+1);
% 绘制单边幅度谱。
subplot(2,1,2);
plot(f,2*abs(Y(1:NFFT/2+1)))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
在我的信号(我的 wav 文件的绝对值)与高斯滤波器卷积后,我尝试采用一阶和二阶导数,但当我尝试绘制它时,我没有得到输出。
边缘=fconv(abs(歌曲),检测);
tedges=edges(P/2:N+P/2-1);
tedges=tedges/max(abs(tedges));
W= diff(tedge);
Z=差异(W);
当我尝试绘制 W 和 Z 时,我没有得到我需要的输出。换句话说,我的图表是空的。我不明白我在这里做错了什么......