5

我正在尝试提取音频文件的峰值。我有以下代码来提取幅度谱的包络。但是我没有得到想要的输出图。有人可以告诉我需要进行哪些调整才能获得正确的图表。这是我的代码:

[song,FS] = wavread('c scale fast.wav');


P=20000/44100*FS;                   % length of filter 
N=length(song);                     % length of song
t=0:1/FS:(N-1)/FS;                  % define time period
% Plot time domain signal
figure(1);
subplot(3,1,1)
plot(t,(3*abs(song)))
title('Wave File')
ylabel('Amplitude')
xlabel('Length (in seconds)')
xlim([0 1.1])

xlim([0 N/FS])


% Gaussian Filter
x = linspace( -1, 1, P);         % create a vector of P values between -1 and 1 inclusive
sigma = 0.335;                  % standard deviation used in Gaussian formula
myFilter = -x .* exp( -(x.^2)/(2*sigma.^2));% compute first derivative, but leave constants out

myFilter = myFilter / sum( abs( myFilter ) ); % normalize
% Plot Gaussian Filter

subplot(3,1,2)       
plot(myFilter)
title('Edge Detection Filter')

% fft convolution
myFilter = myFilter(:);                         % create a column vector
song(length(song)+length(myFilter)-1) = 0;      %zero pad song
myFilter(length(song)) = 0;                     %zero pad myFilter
edges =ifft(fft(song).*fft(myFilter));

tedges=edges(P/2:N+P/2-1);                      % shift by P/2 so peaks line up w/ edges
tedges=tedges/max(abs(tedges));                 % normalize

% Plot song filtered with edge detector          
subplot(3,1,3)

plot(1/FS:1/FS:N/FS,tedges)
title('Song Filtered With Edge Detector')
xlabel('Time (s)')
ylabel('Amplitude')
ylim([-1 1.1])
xlim([0 N/FS])

这是我为上述代码得到的图表,我专注于

这是我为上述代码得到的图表,我专注于“用边缘检测器过滤的歌曲”图

在此处输入图像描述

这是我需要得到的“用边缘检测器过滤的歌曲”图

4

2 回答 2

13

您可以使用希尔伯特变换来获得包络。从技术上讲,这会返回分析信号。您会收到带有以下行的信封:

envelope = abs(hilbert(Song));

希尔伯特变换所做的是获取fft输入的 ,将负频率归零,然后执行ifft。变换的实部是原始信号,虚部是变换后的信号。实部和虚部的绝对值是包络,参数 ( angle(hilbert(Song))) 是瞬时相位。

于 2013-07-22T22:55:39.293 回答
1

我假设您想获得信号的包络(不是您所说的频谱)。如果是这种情况,对于包络检测,我将使用应用的低通滤波器abs(song)(您可以用abs类似的非线性函数代替)。滤波器的截止频率应(略)高于包络变化的最高频率。

您将滤波器直接应用于波形,滤波器似乎不是低通滤波器。也许如果您解释您的方法,我们可以提供更有针对性的帮助。

顺便说一句,如果你的歌曲比你的过滤器长得多,那么后面的零填充fft似乎ifft是一种缓慢的过滤方式。为什么不直接使用conv

于 2013-07-22T20:56:00.563 回答