2012-01-26 105 views
1

所以我已经写在Matlab快速脚本做一些可视化我 -Specgram振幅过滤 - MATLAB R2008a

function spectro(filename,maxFreq) 

wavchunksizefix(filename); 

[y,fs] = wavread(filename); 

subplot(2,1,1); 
plot(y); 
ylim([0 1]); 
title('Signal Amplitude'); 

subplot(2,1,2); 
specgram(y,1024,fs); 
ylim([0 maxFreq]); 
cb = colorbar; 
set(get(cb,'title'),'string','dB'); 
title('Original Signal Spectrogram'); 

什么我不知道是这个 - 怎么做修改specgram()输出,只显示一个具体的dB范围?现在它显示了0到40 dB范围内的一大堆不必要的噪声,我只想看到0到-50 dB(不幸的是,由于我是新手,我无法发布示例图片)。

+0

哟已经使用ylim,请尝试zlim命令。如果这样做不能达到你想要的,在绘图之前从specgram(data = specgram(。。。))和手动提取数据 – learnvst

+0

事实证明(直到现在我还没有真正检查过),来自Specgram()的输出数据是一系列复数。由于我不完全明白他们为什么是复数,我必须先弄清楚。 – user1172075

+0

这些值非常复杂,因为频谱图为您提供了每个时期每个频点的振幅和相位分量。当您使用频谱图命令绘图时,它相当于做冲浪(20 * log10(abs(spectrogram_output)))。 abs命令将实数/复数值对转换为一个数值,而对数项将其转换为数据库比例。 – learnvst

回答

0

非常酷,谢谢你们。我写这篇用于过滤超过40分贝的信号,它似乎与工作

[y,fs] = wavread('matrecord.wav'); 
centerval = mean(y); 
gdb = 20*log10(y/centerval); 
ogv = (gdb > 40); 
x = y; 
x(ogv) = 0; 

当我运行specgram()这一点,似乎工作。