STFT filter bank

STFT filter bank

STFT根据公式不同的写法,可以推导出overlap-add和filter-bank两种不同的实现方式


X(w)=nx(n)w(nmR)ejωn X ( w ) = ∑ n x ( n ) w ( n − m R ) e − j ω n

先暂时讨论R = 1的情况
filter bank可以用以下流程表示


这里写图片描述

分析下以上步骤:
1. 输入信号 x(n) x ( n ) 被一个复指数调制,任意信号都可以分解成正弦函数的叠加,


x(n)=c=Nc=1akejωcn x ( n ) = ∑ c = 1 c = N a k e j ω c n

乘以一个复指数后


x(n)=c=Nc=1akej(ωcωk)n x ( n ) = ∑ c = 1 c = N a k e j ( ω c − ω k ) n

因此复指数调试过程在频域可以看做是进行频谱搬移,即所有频率的信号都往前搬移了 ωk ω k ,可以看出,原先 x(n) x ( n ) 中在 ωk ω k 频率的信号便被调制到了0频率处,
2. 调制后的信号 xk x k 再与窗函数 w w 做卷积,时域卷积对应频域相乘,窗函数在频域为一个低通滤波器,因此输出Xn(ωk)是原先包含 ωk ω k 然后被调制到直流频率处的信号

那如果再在输出解调一下,也就是再乘上一个 ejωkn e j ω k n ,如下图


这里写图片描述

上图整个过程就相当于让 x(n) x ( n ) 通过了一个中心频率为 ωc ω c 的带通滤波器

用代码验证下上述过程的效果

N=20;           % number of filters = DFT length 
fs=1000;        % sampling frequency (arbitrary)
D=1;            % duration in seconds

L = ceil(fs*D)+1; % signal duration (samples)
n = 0:L-1;        % discrete-time axis (samples)
t = n/fs;         % discrete-time axis (sec)
x = chirp(t,0,D,fs/2);   % sine sweep from 0 Hz to fs/2 Hz
%x = echirp(t,0,D,fs/2); % for complex "analytic" chirp 
x = x(1:L);       % trim trailing zeros at end
h = ones(1,N);    % Simple DFT lowpass = rectangular window
%h = hamming(N);  % Better DFT lowpass = Hamming window
X = zeros(N,L);   % X will be the filter bank output
y = zeros(N,L);   % X will be the filter bank output
for k=1:N         % Loop over channels
  wk = 2*pi*(k-1)/N;
  xk = exp(-j*wk*n).* x;  % Modulation by complex exponential
  X(k,:) = filter(h,1,xk);
end
for k=1:N         % Loop over channels
  wk = 2*pi*(k-1)/N;
  yk = exp(1j*wk*n).* X(k,:);  % demodulation by complex exponential
  y(k,:) = yk;
end
y_out = sum(y)/(N*h(1));

上面代码中,输入为扫频信号,20个滤波器组,信号在每个通道先经过调制,然后经过窗滤波,最后再通过解调还原,按照前面的解释,输出的 y y <script type="math/tex" id="MathJax-Element-22">y</script>各个通道应该是带通滤波器的结果,画出几个通道的频谱如下

fft1 = abs(fft(real(y(1,:))));
fft2 = abs(fft(real(y(5,:))));
fft3 = abs(fft(real(y(9,:))));
figure,
omega = (1:length(fft1)/2)*2/length(fft1);
subplot(3,1,1),plot(omega,fft1(1:500)),title('y1')
subplot(3,1,2),plot(omega,fft2(1:500)),title('y5')
subplot(3,1,3),plot(omega,fft3(1:500)),title('y9')


这里写图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STFT(Short-time Fourier Transform)是一种信号处理技术,用于将信号从时域变换到频域,并提供了信号在不同时间段内的频谱信息。MATLAB是一种功能强大的数值计算和可视化软件,提供了丰富的工具包来支持信号处理和频谱分析。 在MATLAB中,可以使用`spectrogram`函数来进行STFT分析。该函数可以接受输入信号以及相关参数,如窗长(window length)、窗类型(window type)和重叠比例(overlap ratio)。利用该函数可以将时域信号分段,并对每个段进行傅里叶变换,从而得到不同时间段内的频谱信息。 除了`spectrogram`函数,MATLAB还提供了其他一些用于频谱分析和STFT的函数。例如,`stft`函数可以直接返回STFT系数,`istft`函数可以进行逆STFT转换,`specgram`函数可以绘制频谱图等。 除了使用内置函数,MATLAB还支持自定义STFT算法的实现。用户可以使用MATLAB中的向量操作和函数进行傅里叶变换,以及利用for循环等控制结构完成STFT算法的编写。这样可以实现更灵活的STFT分析,并根据应用需求进行参数的调整和算法的优化。 总之,通过MATLAB中的函数和工具包,可以方便地进行STFT分析和频谱处理。无论是使用内置函数还是自定义算法,MATLAB都提供了丰富的支持,使得信号处理和频谱分析变得更加简单和高效。 ### 回答2: STFT是短时傅里叶变换的缩写,是一种在信号处理中常用的方法。MATLAB是一种广泛应用于科学和工程计算的高级技术计算语言。在MATLAB中,STFT可以通过使用stft函数进行计算。 STFT可以将信号分成多个较短的时间窗口,并计算每个时间窗口的傅里叶变换。这样可以得到信号在时间和频率上的局部特征。STFT在音频处理、语音识别、图像处理等领域广泛应用。 在MATLAB中,我们可以使用stft函数来计算STFT。该函数有许多可选参数,可以根据需要进行调整。一般来说,我们需要提供信号的时间域数据和一些设置参数,例如窗口大小和重叠率。然后,函数会返回每个时间窗口的傅里叶变换结果。 使用STFT可以得到信号在时间和频率上的细节信息,有助于分析和处理。在MATLAB中,我们可以进一步对STFT结果进行操作,例如应用滤波器、提取特征、合成音频等等。 总之,STFT是一种常用的信号处理方法,而MATLAB提供了方便的工具和函数来计算和处理STFT。无论是音频处理还是其他领域的信号处理,STFT和MATLAB都是非常值得学习和使用的工具。 ### 回答3: STFT是指短时傅里叶变换(Short-Time Fourier Transform)的缩写。在MATLAB中,我们可以使用stft函数来进行STFT的计算和分析。 在MATLAB中,stft函数可以通过对时间序列信号进行窗函数的处理,在每个窗口区域内对信号进行傅里叶变换来得到频谱信息。STFT可以将信号从时域转换为频域,可以对信号的频率特性进行分析。 在使用stft函数时,我们需要指定一些参数,例如窗口大小、窗口类型、重叠率等。窗口大小决定了每个窗口内信号的长度,窗口类型可以选择矩形窗、汉宁窗、哈米窗等不同类型的窗口函数,重叠率可以控制窗口之间是否有重叠。 通过stft函数计算得到的结果是一个二维矩阵,矩阵的行代表不同时间点,列代表不同频率点。可以通过绘制热力图、频谱图等方式进行可视化展示,以直观地观察信号的频率特性。 STFT在信号处理和音频处理等领域有广泛的应用,例如语音识别、音乐信号分析、滤波器设计等。MATLAB提供了方便且高效的stft函数,可以方便地进行STFT的计算与分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值