所以我有这个钢琴录音(.wav格式)。我能够在整个录音中做FFT
并识别频率。
然而,根据我读过的一些文章,如果将wav文件分解为窗口,其中每个窗口将包含一个特定注释,则最佳。
为此,我需要首先绘制我的时域信号的“功率包络”(考虑音符平均能量概念),因此每个音符将有一个增加和一个减少,音符开始可以通过检查当地最低点。
这是引入“窗口”的地方,其中每个窗口只包含一个开始,然后在每个窗口上执行FFT
。
我很难绘制功率范围并将其分解为窗口。非常感谢Matlab
编码的一些帮助。
我使用的代码非常简单:
[wave,fs] = wavread('c scale fast.wav'); %将文件读入内存* /
%声音(波,FS); %看到它听起来像* /
wave = wave。*汉明(长度(波));
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的长度的下一次幂
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 =边缘(P / 2:N + P / 2-1);
tedges = tedges / MAX(ABS(tedges));
W = diff(tedge);
Z = diff(W);
当我尝试绘制W和Z时,我得不到我需要的输出。换句话说,我的图表是空的。我无法弄清楚我在这里做错了什么......
答案 0 :(得分:1)
有用:http://blogs.mathworks.com/videos/2009/12/31/basics-finding-a-subset-of-a-matrix/
基本流程:
for v=1:window_length:length(data)
data_subsection=data(v:v+window_length);
subsection_fft = fft(data_subsection);
plot(...);
end