【问题标题】:Obtain the envelop of a signal using MATLAB使用 MATLAB 获取信号的包络
【发布时间】:2013-07-22 05:51:34
【问题描述】:

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

[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])

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

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

【问题讨论】:

  • 您需要的调整: (a) 以易于理解的方式格式化您的帖子。 (b) 发布一张图表,说明您目前拥有的地块、问题所在以及您期望得到的结果。
  • 很抱歉给您带来不便。我已经包括了情节。

标签: matlab envelope


【解决方案1】:

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

envelope = abs(hilbert(Song));

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

【讨论】:

  • 只要 OP 可以使用转换而不是过滤器就可以了。希尔伯特变换是non-causal。但是,可以构造希尔伯特变换IIRFIR 滤波器逼近。
  • 在OP的代码中,将整首歌曲放入内存中再处理,所以非因果性应该没有问题(如果OP要实时查找包络,这种方法行不通)。
  • 谢谢。那么希尔伯特变换并没有给我一个适当的包络。似乎有噪音,而从顶部算起的第五张图是我想要得到的。是的,我可能需要实时工作。
【解决方案2】:

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

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

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

【讨论】:

  • 我从以前的作品中得到了这个想法。我基本上需要检测钢琴曲中的音符。它应该实时完成,但现在我正在处理录制的片段。第一步是检测音符开始,这就是为什么我试图创建一个高斯滤波器并对我的歌曲进行快速卷积,这样我就可以得到歌曲的包络并通过找到峰值来定义音符开始。正如您从上面的图表中看到的(准确地说是从上到下第 3 个),我没有得到输入波形的正确包络。根据我的阅读,FFT conv 比 conv 更好,因为它更快。
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2013-11-20
  • 2012-07-08
  • 1970-01-01
  • 2019-07-19
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多