Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用MATLAB求信号的包络_Matlab_Envelope - Fatal编程技术网

用MATLAB求信号的包络

用MATLAB求信号的包络,matlab,envelope,Matlab,Envelope,我试图提取音频文件的峰值。我有下面的代码来提取振幅谱的包络。但是,我没有得到所需的输出图。有人能告诉我需要做什么调整才能得到一个合适的图表吗。这是我的密码: [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;

我试图提取音频文件的峰值。我有下面的代码来提取振幅谱的包络。但是,我没有得到所需的输出图。有人能告诉我需要做什么调整才能得到一个合适的图表吗。这是我的密码:

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

这是我从上面代码中得到的图表,我将重点放在“用边缘检测器过滤的歌曲”图上


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

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

您将滤波器直接应用于波形,而滤波器似乎不是低通滤波器。也许如果你解释一下你的方法,我们可以提供更集中的帮助


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

您可以使用希尔伯特变换来获得包络。从技术上讲,这将返回。您可以通过以下行获得信封:

envelope = abs(hilbert(Song));

希尔伯特变换的作用是对输入进行
fft
,将负频率归零,然后进行
ifft
。变换的实部是原始信号,虚部是变换后的信号。实部和虚部的绝对值是信封,参数(
角度(希尔伯特(歌曲))
)是瞬时相位。

你需要的调整:(a)以可理解的方式格式化你的帖子。(b) 张贴一张图,说明您目前拥有的绘图、它有什么问题以及您期望得到的结果。对于给您带来的不便,我们深表歉意。我包括了绘图。只要OP可以使用变换而不是过滤器就好。希尔伯特变换是。但是,可以构造希尔伯特变换和滤波器近似。在OP的代码中,整个歌曲都被放入内存,然后进行处理,因此非因果关系不应该是一个问题(如果OP想要实时找到封套,这种方法将不起作用)。谢谢。希尔伯特变换没有给我一个合适的包络。似乎有噪音,而从顶部开始的第五个图形,是我想要得到的。是的,我可能需要实时处理。我从以前的工作中得到了这个想法。我基本上需要检测钢琴演奏的音符。这应该是实时完成的,但现在我正在处理录制的作品。第一步是检测音符的起始点,这就是为什么我试图创建一个高斯滤波器,并对我的歌曲进行快速卷积,这样我就可以得到歌曲的包络,并通过找到峰值来定义音符的起始点。从上面的图中可以看出(确切地说是从顶部算起的第三个图),我没有得到输入波形的正确包络。从我所读到的,FFT-conv比conv好,因为它更快。