用matlab 选取图像区域计算图像背景区域空间噪声Vrms

上几篇文章写了、、、等数字信号处理中的算法,今天写一下STFT算法(其实我刚开始是想搞小波变换wavelet的,搞了个大概就转成STFT了)的介绍。另外,我模仿安捷伦示波器写了CF值为3.1/4.8/6.0/7.0的高斯随机数生成算法(极限推导理论CF=Vpp/Vrms值为6,我的算法还存在缺陷),还有一下乱七八糟的算法就不拿出来丢人了。这些算法都是很久以前仓促完成的,有好多待优化的地方,代码风格可能也比较乱,努力改正!

注:我比较喜欢使用matlab(也喜欢自己修改matlab的源码做测试,所以重装了好几次了,囧。。。),有部分参考matlab的算法进行(或者直接翻译为OC),算法的运行结果经常会跟matlab运算结果进行比较,算法只做学习用,转载请注明。

另外着手写这些算法时,我还是obj-c小白,可能会有代码、算法不足或者理解偏差的地方,路过的高人请不吝赐教。

一、先说说STFT的理论

STFT(short-time Fourier transform,短时傅里叶变换)是和傅里叶变换相关的一种数学变换,用以确定时变信号其局部区域正弦波的频率与相位。

用途:与小波变换相似,经STFT处理后的信号具有时域和频域的局部化特性(见下图),可以借助其分析信号的视频特性。

局限:STFT的使用范围受其变换性质的局限。STFT是一种基于窗函数的变换,一般来说,短窗能够提供较好的时域解析度,长窗能够提供较好的频域解析度。这导致其实在研究过程中,还是只能侧重一种研究角度,或称一种侧重的分辨率。所以这并不是多分辨率分析。这也是为什么之后又提出了小波变换的原因之一。

以下介绍的与其说是原理,不如说时如何理解短时傅里叶变换。

顾名思义,短时傅里叶变换就是将原来的傅里叶变换在时域截短为多段分别进行傅里叶变换,每一段记为时刻ti,对应FFT求出频域特性,就可以粗略估计出时刻ti时的频域特性(也就是同时指导了时域和频域的对应关系)。用于信号截短的工具叫做窗函数(宽度相当于时间长度),窗越小,时域特性越明显,但是此时由于点数过少导致FFT降低了精确度,导致频域特性不明显。因此说窗的选取(包括大小和类型)是一个博弈的过程,根据自己研究的角度,选取适合的窗即可,当然最好还是选小波变换。。。

另外,为了保证频域特性的基础上提高时域特性,经常选择前后窗函数重叠一部分,这样两个窗确定的时刻就比较接近就提高了时域分析能力。但不是重叠越多越好,重叠点数过多会大幅增加计算量,导致效率低下,因此前后窗重叠的点数也需要外加确定。

给张图方便理解,图中矩形表示窗,窗确定的时刻为窗的中间时刻:

对STFT已经有了初步的了解,那么就开始设计吧~设计思路如下:

(3)根据窗的大小,将signal拆分,并与窗函数相乘;

(4)对每个signal片段进行N点FFT,并求出能量谱密度;

(5)调用绘图方法,把能量谱密度(功率谱密度)用不同的颜色表示出来绘图。

根据窗的长度截取响应长度的信号序列,然后二者对应的点逐点相乘,得到的数即为加窗截取后的值。之所以需要乘以窗函数,是因为如果直接截取信号,会使得截取的信号出现突变(波形上表现为直角),经过变换后会出现无限谐波影响截取后FFT的效果。

根据能量谱密度值的不同选择不同的颜色表示,值从低到高对应颜色从冷色到暖色变化。颜色色谱如下图所示(冷→暖):

②在matlab中colormap可以调出颜色条图对应的RGB值数组;

③复制一下RGB对应的数组如下:

(4)能量谱密度(功率谱密度PSD)

①设一个能量信号 s(t)

的能量为E,则此信号的能量由下式决定:

②在MATLAB中计算过程是

首先对截短的信号分别进行FFT并求模的平方(实部平方+虚部平方),然后除以窗函数的平方和得到Sxx。根据Sxx计算第一项分量(直流分量10lg10(|Sxx/fs|))、中间项(交流分量10lg10(|2*Sxx/fs|))和最后一项(fft计算点数为奇数与中间项一致,否则与第一项一致)。

上面的介绍已经说明了设计思路,这里就不画流程图,直接上代码了

本部分的代码完全模仿matlab做的,所以如果有什么不明白的可以去查看matlab源码。另外,本部分的代码没有拆分,而是把所有的功能都用一个方法实现,自觉地给自己一个差评。。。

注:写本部分代码的时候我对objc还是小白,所以基本用的都是c语言的格式。。。

//计算短时傅里叶变换信号数组的行与列数,行数=时间点数,列数=窗长度 //对拆分后的信号进行FFT }2.绘图方法
在上面的代码中Drawing类是自定义的一个绘图类,完成的功能是将数据点显示在模拟器上。绘图的流程时先给定绘图区域的四个顶点坐标和分区块数,然后指定绘图区域序号进行指定区域绘图。

绘图思想是:将给定的数据点确定范围后,一一对应冷暖色条中的颜色,然后绘制每一个颜色点即可。给出绘制颜色点方法如下:

//一次性画多个颜色点
 
 
 
 
 
好啦,该努力的都努力完了,看看效果吧~~~






1.先看看STFT观察跳频


给定波形由三个频率的信号叠加而成:
















%% 变频信号的fft观察
%% 定义一个变频信号的参数
 


利用iOS程序测试,结果如下


③结果简单总结,从上面两幅图可以看出,
A.matlab运行的结果含有直流分量绘图(iOS去掉了)。
B.另外颜色有偏差,原因可能是功率谱密度与冷暖色条对应的方式不同(我没深究。。。)。
2.再看看STFT观察对语音的分析

①看看matlab程序及结果


②看看ios的测试结果

从图中看差不多完全一样,还有些小激动呢~

说是比一比效率,其实就是看谁跑得快,看谁用时多。效率与当前的运行环境等各种因素有关,所以这里只做简单的测试。。。下标是经过多次测试后去多个靠谱的数平均得到的。
看看人家运行的效率,好奇心四起有木有?!!!!我将继续。。。
另外,附代码用时测试的方法 // ...需要测试的代码

}

上几篇文章写了、、、等数字信号处理中的算法,今天写一下STFT算法(其实我刚开始是想搞小波变换wavelet的,搞了个大概就转成STFT了)的介绍。另外,我模仿安捷伦示波器写了CF值为3.1/4.8/6.0/7.0的高斯随机数生成算法(极限推导理论CF=Vpp/Vrms值为6,我的算法还存在缺陷),还有一下乱七八糟的算法就不拿出来丢人了。这些算法都是很久以前仓促完成的,有好多待优化的地方,代码风格可能也比较乱,努力改正!

注:我比较喜欢使用matlab(也喜欢自己修改matlab的源码做测试,所以重装了好几次了,囧。。。),有部分参考matlab的算法进行(或者直接翻译为OC),算法的运行结果经常会跟matlab运算结果进行比较,算法只做学习用,转载请注明。

另外着手写这些算法时,我还是obj-c小白,可能会有代码、算法不足或者理解偏差的地方,路过的高人请不吝赐教。

一、先说说STFT的理论

STFT(short-time Fourier transform,短时傅里叶变换)是和傅里叶变换相关的一种数学变换,用以确定时变信号其局部区域正弦波的频率与相位。

用途:与小波变换相似,经STFT处理后的信号具有时域和频域的局部化特性(见下图),可以借助其分析信号的视频特性。

局限:STFT的使用范围受其变换性质的局限。STFT是一种基于窗函数的变换,一般来说,短窗能够提供较好的时域解析度,长窗能够提供较好的频域解析度。这导致其实在研究过程中,还是只能侧重一种研究角度,或称一种侧重的分辨率。所以这并不是多分辨率分析。这也是为什么之后又提出了小波变换的原因之一。

以下介绍的与其说是原理,不如说时如何理解短时傅里叶变换。

顾名思义,短时傅里叶变换就是将原来的傅里叶变换在时域截短为多段分别进行傅里叶变换,每一段记为时刻ti,对应FFT求出频域特性,就可以粗略估计出时刻ti时的频域特性(也就是同时指导了时域和频域的对应关系)。用于信号截短的工具叫做窗函数(宽度相当于时间长度),窗越小,时域特性越明显,但是此时由于点数过少导致FFT降低了精确度,导致频域特性不明显。因此说窗的选取(包括大小和类型)是一个博弈的过程,根据自己研究的角度,选取适合的窗即可,当然最好还是选小波变换。。。

另外,为了保证频域特性的基础上提高时域特性,经常选择前后窗函数重叠一部分,这样两个窗确定的时刻就比较接近就提高了时域分析能力。但不是重叠越多越好,重叠点数过多会大幅增加计算量,导致效率低下,因此前后窗重叠的点数也需要外加确定。

给张图方便理解,图中矩形表示窗,窗确定的时刻为窗的中间时刻:

对STFT已经有了初步的了解,那么就开始设计吧~设计思路如下:

(3)根据窗的大小,将signal拆分,并与窗函数相乘;

(4)对每个signal片段进行N点FFT,并求出能量谱密度;

(5)调用绘图方法,把能量谱密度(功率谱密度)用不同的颜色表示出来绘图。

根据窗的长度截取响应长度的信号序列,然后二者对应的点逐点相乘,得到的数即为加窗截取后的值。之所以需要乘以窗函数,是因为如果直接截取信号,会使得截取的信号出现突变(波形上表现为直角),经过变换后会出现无限谐波影响截取后FFT的效果。

根据能量谱密度值的不同选择不同的颜色表示,值从低到高对应颜色从冷色到暖色变化。颜色色谱如下图所示(冷→暖):

②在matlab中colormap可以调出颜色条图对应的RGB值数组;

③复制一下RGB对应的数组如下:

(4)能量谱密度(功率谱密度PSD)

①设一个能量信号 s(t)

的能量为E,则此信号的能量由下式决定:

②在MATLAB中计算过程是

首先对截短的信号分别进行FFT并求模的平方(实部平方+虚部平方),然后除以窗函数的平方和得到Sxx。根据Sxx计算第一项分量(直流分量10lg10(|Sxx/fs|))、中间项(交流分量10lg10(|2*Sxx/fs|))和最后一项(fft计算点数为奇数与中间项一致,否则与第一项一致)。

上面的介绍已经说明了设计思路,这里就不画流程图,直接上代码了

本部分的代码完全模仿matlab做的,所以如果有什么不明白的可以去查看matlab源码。另外,本部分的代码没有拆分,而是把所有的功能都用一个方法实现,自觉地给自己一个差评。。。

注:写本部分代码的时候我对objc还是小白,所以基本用的都是c语言的格式。。。

//计算短时傅里叶变换信号数组的行与列数,行数=时间点数,列数=窗长度 //对拆分后的信号进行FFT }2.绘图方法
在上面的代码中Drawing类是自定义的一个绘图类,完成的功能是将数据点显示在模拟器上。绘图的流程时先给定绘图区域的四个顶点坐标和分区块数,然后指定绘图区域序号进行指定区域绘图。

绘图思想是:将给定的数据点确定范围后,一一对应冷暖色条中的颜色,然后绘制每一个颜色点即可。给出绘制颜色点方法如下:

//一次性画多个颜色点
 
 
 
 
 
好啦,该努力的都努力完了,看看效果吧~~~






1.先看看STFT观察跳频


给定波形由三个频率的信号叠加而成:
















%% 变频信号的fft观察
%% 定义一个变频信号的参数
 


利用iOS程序测试,结果如下


③结果简单总结,从上面两幅图可以看出,
A.matlab运行的结果含有直流分量绘图(iOS去掉了)。
B.另外颜色有偏差,原因可能是功率谱密度与冷暖色条对应的方式不同(我没深究。。。)。
2.再看看STFT观察对语音的分析

①看看matlab程序及结果


②看看ios的测试结果

从图中看差不多完全一样,还有些小激动呢~

说是比一比效率,其实就是看谁跑得快,看谁用时多。效率与当前的运行环境等各种因素有关,所以这里只做简单的测试。。。下标是经过多次测试后去多个靠谱的数平均得到的。
看看人家运行的效率,好奇心四起有木有?!!!!我将继续。。。
另外,附代码用时测试的方法 // ...需要测试的代码

}

我要回帖

更多关于 matlab 选取图像区域 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信