企业网站经典案例,建立网站所需费用项目清单,o2o网站功能,天津外贸营销型网站建设在Matlab中#xff0c;做短时傅里叶变换需要使用函数spectrogram#xff0c;而在Matlab2019中#xff0c;引入了一个新的函数stft#xff0c;下面我们就来看下这两个函数都如何使用。短时傅里叶变换的基本原理就是将数据分段加窗#xff0c;做fft#xff0c;在分段时会有… 在Matlab中做短时傅里叶变换需要使用函数spectrogram而在Matlab2019中引入了一个新的函数stft下面我们就来看下这两个函数都如何使用。 短时傅里叶变换的基本原理就是将数据分段加窗做fft在分段时会有overlap因此一个向量的短时傅里叶变换结果是一个矩阵。了解了这点下面的函数及参数就更加容易理解了。spectrogram参数列表 先来看spectrogram函数在更早期的版本中这个函数的名字是specgram几种常用的用法如下spectrogram(x)
s spectrogram(x)
s spectrogram(x, window)
s spectrogram(x, window, noverlap)
s spectrogram(x, window, noverlap, nfft)
s spectrogram(x, window, noverlap, nfft, fs)
[s, f, t] spectrogram(x, window, noverlap, nfft, fs)
[s, f, t] spectrogram(x, window, noverlap, f, fs)
[s, f, t, p] spectrogram(x, window, noverlap, f, fs)
其中x表示输入信号window表示窗函数如果window的值是一个整数那么被分段的x的每一段的长度都等于window并采用默认的Hamming窗如果window是一个向量那么被分段后每一段的长度都等于length(window)且输入的向量即为所要加的窗函数overlap表示两段之间的重合点数overlap的值必须要小于窗长如果没有指定overlap默认是窗长的一半即50%的overlapnfft表示fft的点数fft的点数跟窗长可以是不同的当没有指定该参数时Matlab会取max(256, 2^(ceil(log2(length(window)))))即当窗长小于256时fft的点数是256当窗长大于256时fft的点数取大于窗长的最小的2的整数次幂fs表示采样率用来归一化显示使用f表示显示的频谱范围f是一个向量长度跟s的行数相同当x是实信号且nfft为偶数时s的行数为(nfft/21)当x是实信号且nfft为奇数时s的行数为(nfft1)/2当x是复信号时s的行数为nfft当在输入的参数列表中指定f后函数会在f指定的频率处计算频谱图返回的f跟输入的f是相同的t表示显示的时间范围是一个向量长度跟s的列数相同p表示功率谱密度对于实信号p是各段PSD的单边周期估计对于复信号当指定F频率向量时P为双边PSD;如何计算PSDExamples 首先生成信号如下4个点频信号拼接起来clc;clear all;close all;
fs 10e6;
n 10000;
f1 10e3; f2 50e3; f3 80e3; f4 100e3;
t (0:n-1)/fs;
sig1 cos(2*pi*f1*t);
sig2 cos(2*pi*f2*t);
sig3 cos(2*pi*f3*t);
sig4 cos(2*pi*f4*t);sig [sig1; sig2; sig3; sig4];信号的时域波形如下 直接调用spectrogram(sig)可得如下结果图中默认横轴是频率纵轴是时间 为了绘图更灵活我们不直接用spectrogram绘图而且求出s后再对s单独绘图这次我们指定window的大小为256s spectrogram(sig, 256);
t linspace(0, 4*n/fs, size(s,1));
f linspace(0, fs/2, size(s,2));
figure;
imagesc(t, f, 20*log10((abs(s))));xlabel(Samples); ylabel(Freqency);
colorbar;
noverlap默认是50%现在我们把它设为window的长度减1即每次的步进为1s spectrogram(sig, 256, 255);
t linspace(0, 4*n/fs, size(s,1));
f linspace(0, fs/2, size(s,2));
figure;
imagesc(t, f, 20*log10((abs(s))));xlabel(Samples); ylabel(Freqency);
colorbar;再加上nfft和fs参数我们指定fft点数就是窗长s spectrogram(sig, 256, 128, 256, fs);这个的图形跟之前一样不再画了 如果在返回值中增加f和t这样我们下面就不用再重新定义f和t了[s, f, t] spectrogram(sig, 256, 128, 256, fs);
figure;
imagesc(t, f, 20*log10((abs(s))));xlabel(Samples); ylabel(Freqency);
colorbar;从上面的图中我们可以看出我们的4个信号的频率都比较小而画出来的图显示的频谱范围比较大导致下面很大一部分信息我们其实都不需要。这时我们就可以通过指定f的区间来计算频谱。为了显示效果更好我们把其他参数也调一下window 2048;
noverlap window/2;
f_len window/2 1;
f linspace(0, 150e3, f_len);
[s, f, t] spectrogram(sig, window, noverlap , f, fs);
figure;
imagesc(t, f, 20*log10((abs(s))));xlabel(Samples); ylabel(Freqency);
colorbar;最后再把功率谱密度的返回值加上[s, f, t, p] spectrogram(sig, window, nfft, f, fs);
figure;
imagesc(t, f, p);xlabel(Samples); ylabel(Freqency);
colorbar;
stft 这个函数在Matlab的解释并不是很多example也只写了两个但用法比较简单window 2048;
noverlap window/2;
nfft window;
[s, f, t, p] spectrogram(sig, window, noverlap, nfft, fs);
figure;
imagesc(t, f, 20*log10((abs(s))));xlabel(Samples); ylabel(Freqency);
title(使用spectrogram画出的短时傅里叶变换图形);
colorbar;ss stft(sig,fs,Window,hamming(window),OverlapLength,window/2,FFTLength,nfft);
figure;
imagesc(t, f, 20*log10((abs(ss(1024:end,:)))));xlabel(Samples); ylabel(Freqency);
title(使用stft画出的短时傅里叶变换图形);
colorbar;
欢迎关注微信公众号Quant_Timeshttp://weixin.qq.com/r/Mi7t9T3EpWDarXmW93sg (二维码自动识别)