在下面的代码中,我试图获得非平稳信号的spectrogram,在运行代码后,我希望看到一些类似于张贴的词"image_2“,频率与时间的表示。但是发布的代码的结果是image_1。
有谁能引导我找到正确的spectrogram吗?
码
% Time specifications:
Fs = 8000; % samples per second
dt = 1/Fs; % seconds per sample
StopTime = 1; % seconds
t = (0:dt:StopTime-dt); % seconds
t1 = (0:dt:.25);
t2 = (.25:dt:.50);
t3 = (.5:dt:.75);
t4 = (.75:dt:1);
%get a full-length example of each signal component
x1 = (10)*sin(2*pi*100*t);
x2 = (10)*sin(2*pi*200*t);
x3 = (10)*sin(2*pi*300*t);
x4 = (10)*sin(2*pi*400*t);
%construct a composite signal
x = zeros(size(t));
I = find((t >= t1(1)) & (t <= t1(end)));
x(I) = x1(I);
I = find((t >= t2(1)) & (t <= t2(end)));
x(I) = x2(I);
I = find((t >= t3(1)) & (t <= t3(end)));
x(I) = x3(I);
I = find((t >= t4(1)) & (t <= t4(end)));
x(I) = x4(I);
NFFT = 2 ^ nextpow2(length(t)); % Next power of 2 from length of y
Y = fft(x, NFFT);
f = Fs / 2 * linspace(0, 1, NFFT/2 + 1);
figure;
plot(f(1:200), 2 * abs( Y( 1:200) ) );
T = 0:.001:1;
spectrogram(x,10,9);
ylabel('Frequency');
axis(get(gcf,'children'), [0, 1, 1, 100]);发布代码的结果: Spectrogram_Image_1:

我想要得到的: Image_2:

Update_1,图像代码
%now call the spectrogram
spectrogram(x, window, noverlap, Nfft, Fs);
ylabel('Frequency');
axis(get(gcf,'children'), [0, 1]);

发布于 2015-01-03 13:17:53
首先,和您第一次问这个问题一样,您是否在时域(即plot(t, x))绘制了数据,并放大了转换以确保您的信号是您所认为的?它是否有四个不同的周期,与你意愿的频率不同?
假设确实如此,我很肯定您的问题是您的spectrogram调用没有做您想做的事情。我认为你只有一个NFFT 10,这意味着你的垃圾箱是800赫兹宽,这不足以解决你的频率,只有100赫兹的间隔。
在我看来,您应该指定更多的参数,以便您知道它正在做什么。您将指定一个Nfft,它将给出所需的频率分辨率。分辨率大于100赫兹的东西(让我们尝试25赫兹),但不需要太多的点,它比你有稳定频率的持续时间长(所以,小于0.25秒,这意味着少于2000点)。
为了了解如何指定FFT的长度,我查看了文档:http://www.mathworks.com/help/signal/ref/spectrogram.html
根据文档,我将尝试五个参数版本:spectrogram(x,window,noverlap,nfft,fs)
对于您已经定义了Fs和x的代码,谱图调用如下所示:
%define FFT parameters
des_df_Hz = 25; %desired frequency resolution for the display, Hz
Nfft = round(FS / des_df_Hz); %general rule for FFT resolution
Nfft = 2*Nfft; %double the bins to account for spreading due to windowing
Nfft = 2*round(0.5*Nfft); %make Nfft an even number
window = Nfft; %make your window the same length as your FFT
noverlap = round(0.95); %overlap a lot to make the plot pretty
%now call the spectrogram
spectrogram(x, window, noverlap, Nfft, Fs,'yaxis');https://stackoverflow.com/questions/27753757
复制相似问题