matlab中stft和spectrogram函数区别

2024-06-19 14:48

本文主要是介绍matlab中stft和spectrogram函数区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在最开头,两个几乎没有差别。
结果一模一样,只是取了分帧加窗fft的不同点而已。
先贴上程序。

clear;
clc;
close all;[sig,fs] = audioread('1.wav');
window_len = 400;
nfft = 1024;
windowt = hamming(window_len);
hoplen = window_len/2;% matlab自带stft
[stfts,f_stft,t_stft] = stft(sig, fs, 'Window',windowt, 'OverlapLength',hoplen, 'FFTLength',nfft);
figure;
y_stft = abs(stfts(:,:));
imagesc(t_stft, f_stft, 20*log10(y_stft));
xlabel('Samples');
ylabel('Freqency');
title(['自带stft nfft=' num2str(nfft) ', windowlen=' num2str(window_len) ' 短时傅里叶变换']);
colorbar;% matlab自带spectrogram函数
[spectrograms, f_spectrograms, t_spectrograms, p] = spectrogram(sig, windowt, hoplen, nfft, fs);
figure;
y_spectrograms = abs(spectrograms(end:-1:1,:));
imagesc(t_spectrograms, f_spectrograms, 20*log10(y_spectrograms));
xlabel('Samples'); 
ylabel('Freqency');
xlabel('Samples');
ylabel('Freqency');
title(['自带spectrogram, nfft=' num2str(nfft) ', windowlen=' num2str(window_len)]);
colorbar;% N = 0; %选择一个帧验证,可注释掉
% sig_s = sig(window_len*N + 1 + hoplen : window_len*N + window_len + hoplen).*windowt;
% y_fft = fft(sig_s, nfft);
% f_fft = fs*(1:(nfft))/nfft;
% y_fft = abs(y_fft);
% figure;
% plot(f_fft,y_fft)% 自己写的fft加窗求得stft
frame_num = floor((length(sig)-window_len) / hoplen + 1);
my_spectrogram = zeros(nfft/2+1, frame_num);
my_stft = zeros(nfft, frame_num);
for i = 1:frame_numsig_sfft = sig(1+hoplen*(i-1) : hoplen*(i-1)+window_len).*windowt;yfft_new = abs(fft(sig_sfft, nfft));my_spectrogram(:,i) = [yfft_new(nfft/2+1 : end); yfft_new(1)];my_stft(:,i) = [yfft_new(nfft/2+2 : end); yfft_new(1 : nfft/2+1)];
end
figure;
imagesc(t_stft, f_stft, 20*log10(my_stft));
xlabel('Samples');
ylabel('Freqency');
title(['分帧加窗fft后的stft, nfft=' num2str(nfft) ', windowlen=' num2str(window_len)]);
colorbar;
if (length(unique(y_stft == my_stft)) == 1) % ans = 1 说明完全一致disp('stft 验证正确');
end
if (length(unique(y_spectrograms == my_spectrogram)) == 1)disp('spectrogram 验证正确');
end

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出

stft 验证正确
spectrogram 验证正确

点数对应关系:
在这里插入图片描述

这篇关于matlab中stft和spectrogram函数区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075326

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以