【发布时间】:2013-06-13 04:23:41
【问题描述】:
所以我有这个钢琴录音(.wav 格式)。我可以对整个录音进行FFT 并识别频率。
但是,根据我阅读的一些文章,最好将 wav 文件分解为多个窗口,其中每个窗口都包含一个特定的注释。
为此,我需要首先绘制我的时域信号的“功率包络”(考虑到音符平均能量概念),因此每个音符都会有一个增加和一个减少,并且可以通过检查来确定音符开始局部最小值。
这是引入“窗口”的地方,每个窗口仅包含一个起始点,然后在每个窗口上执行FFT。
我在绘制功率包络并将其分解为窗口时遇到了困难。希望对 Matlab 编码提供一些帮助。
我使用的代码非常简单:
[wave,fs] = wavread ('c scale fast.wav'); % 将文件读入内存 */
%声音(波,fs); % 看看它听起来像什么 */
wave = wave.*hamming(length(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 长度的 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 文件的绝对值)与高斯滤波器卷积后,我尝试采用一阶和二阶导数,但是当我尝试绘制它时没有得到输出。
edges=fconv(abs(song),detect);
边=边(P/2:N+P/2-1);
tedges=tedges/max(abs(tedges));
W= 差异(tedge);
Z= diff(W);
当我尝试绘制 W 和 Z 时,我没有得到我需要的输出。换句话说,我的图表是空的。我无法弄清楚我在这里做错了什么......
【问题讨论】:
-
您能否发布代码以便我们知道您已经尝试过什么?
-
我已经包含了代码