动态演示频域采样与时域周期延拓现象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态演示频域采样与时域周期延拓现象相关的知识,希望对你有一定的参考价值。
① 产生一时域序列信号,长度为N;对其频谱进行采样,取得M个频谱抽样值;
② 动态演示通过M个频谱抽样值恢复时域序列的过程(M根据程序处理需要指定范围),演 示原信号频谱及其抽样值信号,演示时域原始序列及由频谱抽样值恢复的周期延拓时域序列。
③ 动态演示频域采样与时域周期延拓序列主值区域的关系;
matlab怎么进行动态演示
假如我产生了一个 M 长三角波序列 x(n)
往后我怎么编这个代码 才能是动态演示上述过程
频域采样定理演示程序的设计(频域采样时域周期延拓)
目的:① 熟练掌握MATLAB工具软件在工程设计中的使用;
② 熟练掌握频域采样定理在数字信号处理中的重要意义。
要求:① 动态演示频域采样与时域周期延拓现象;
② 动态演示频域采样与时域周期延拓序列主值区域的关系;
③ 说明频域采样点数M不小于时域序列长度N的必要性。
步骤:① 产生一时域序列信号,长度为N;对其频谱进行采样,取得M个频谱抽样值;
② 动态演示通过M个频谱抽样值恢复时域序列的过程(M根据程序处理需要指定范围),演 示原信号频谱及其抽样值信号,演示时域原始序列及由频谱抽样值恢复的周期延拓时域序列。
③ 动态演示频域采样与时域周期延拓序列主值区域的关系;
④ 分析说明M大于等于N的必要性。
Tp=64/1000; %观察时间Tp=64微秒
%产生M长采样序列x(n)
% Fs=1000;T=1/Fs;
Fs=1000;T=1/Fs;
M=Tp*Fs;n=0:M-1;
A=444.128;alph=pi*50*2^0.5;omega=pi*50*2^0.5;
xnt=A*exp(-alph*n*T).*sin(omega*n*T);
Xk=T*fft(xnt,M); %M点FFT[xnt)]
yn='xa(nT)';subplot(3,2,1);
tstem(xnt,yn); %调用自编绘图函数tstem绘制序列图
box on;title('(a) Fs=1000Hz');
k=0:M-1;fk=k/Tp;
subplot(3,2,2);plot(fk,abs(Xk));title('(a) T*FT[xa(nT)],Fs=1000Hz');
xlabel('f(Hz)');ylabel('幅度');axis([0,Fs,0,1.2*max(abs(Xk))])
%=================================================
% Fs=300Hz和 Fs=200Hz的程序与上面Fs=1000Hz完全相同。
2 频域采样理论的验证程序清单
%频域采样理论验证程序exp2b.m
M=27;N=32;n=0:M;
%产生M长三角波序列x(n)
xa=0:floor(M/2); xb= ceil(M/2)-1:-1:0; xn=[xa,xb];
Xk=fft(xn,1024); %1024点FFT[x(n)], 用于近似序列x(n)的TF
X32k=fft(xn,32) ;%32点FFT[x(n)]
x32n=ifft(X32k); %32点IFFT[X32(k)]得到x32(n)
X16k=X32k(1:2:N); %隔点抽取X32k得到X16(K)
x16n=ifft(X16k,N/2); %16点IFFT[X16(k)]得到x16(n)
subplot(3,2,2);stem(n,xn,'.');box on
title('(b) 三角波序列x(n)');xlabel('n');ylabel('x(n)');axis([0,32,0,20])
k=0:1023;wk=2*k/1024; %
subplot(3,2,1);plot(wk,abs(Xk));title('(a)FT[x(n)]');
xlabel('omega/pi');ylabel('|X(e^j^omega)|');axis([0,1,0,200])
k=0:N/2-1;
subplot(3,2,3);stem(k,abs(X16k),'.');box on
title('(c) 16点频域采样');xlabel('k');ylabel('|X_1_6(k)|');axis([0,8,0,200])
n1=0:N/2-1;
subplot(3,2,4);stem(n1,x16n,'.');box on
title('(d) 16点IDFT[X_1_6(k)]');xlabel('n');ylabel('x_1_6(n)');axis([0,32,0,20])
k=0:N-1;
subplot(3,2,5);stem(k,abs(X32k),'.');box on
title('(e) 32点频域采样');xlabel('k');ylabel('|X_3_2(k)|');axis([0,16,0,200])
n1=0:N-1;
subplot(3,2,6);stem(n1,x32n,'.');box on
title('(f) 32点IDFT[X_3_2(k)]');xlabel('n');ylabel('x_3_2(n)');axis([0,32,0,20]) 参考技术A 信号时域离散化导致频域周期化实信号抽样后,就离散化了,和fourier级数有关 参考技术B 你是中国科学院的吧?这都啥玩意啊
opencv之傅里叶变换
一、离散傅里叶变换
离散傅里叶变换是高数中的内容了,自己都不大记得具体的原理了,在这里先复习并记录下来,方便以后查阅。英文全称为Discrete Fourier Transform,简称DFT,是指傅里叶变换在时域和频域都呈现离散的形式,将时域的信号采样变换为在离散时间傅里叶变换频域的采样。在形式上做变换的两端的序列是有限长的,实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限序列的信号做DTF,也应当对其进行周期延拓成为周期信号在进行变换。通常使用快速傅里叶变换来高效计算DFT。
对于一张图片进行傅里叶变换就是将它分解为正弦和余弦两部分,以完成从空间域到频域的转换。在转换到频域时以复数的形式存在,因此变换后的结果需要使用实数图像和虚数图像,或者幅度图像加相位图像的形式。但是在实际处理当中仅仅使用了幅度图像(magitude Image),因为幅度图像包含了几乎所有的原图像的几何信息。但是如果想用傅里叶逆变换就需要同时保留幅度图像和相位图像,才能实现对原图像的操作。
在频域里,对于一幅图像,高频部分代表了图像的、纹理信息;低频部分则代表了图像的轮廓信息。如果图像受到的噪声恰好在某个特定的频率范围内,就可以使用滤波器来恢复原来的图像。因此傅里叶变换在图像处理中可以做到图像增强和去噪、图像分割之边缘检测、图像特征提取和压缩等。
二、opencv傅里叶变换的处理函数
ˇdft()函数
1 void dft(InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0);
ˇ第一个参数:InputArray类型的src,输入矩阵,可以为实数或者虚数。
ˇ第二个参数:OutputArray类型的dst,运算结果保存在这里,其尺寸和类型取决于第三个参数
ˇ第三个参数:int类型的flags。转换的标识符,默认值为0,取值可以为:
1 DFT_INVERSE -----> 一维或者二维逆变换 2 DFT_SCALE -----> 输出结果以1/N进行缩放,通常结合DFT_INVERSE使用
3 DFT_ROWS -----> 对输入矩阵的每行进性正向或者逆向变换,用于在处理多种矢量的时候用于减小资源开销,通常用于三维或者高维变换的操作
4 DFT_COMPLEX_OUTPUT -----> 进行一维或者二维实数数组的正变换。其结果是复数阵列,拥有复数的共轭对称性也可以写成一个同样尺寸的实数阵列
5 DFT_REAL_OUTPUT -----> 进行一维或二维复数数组反变换。其结果是一个同样大小的复矩阵,如果输入的矩阵具有共轭对称性,便会输出实数矩阵
ˇ第四个参数:默认为0,非0时,函数会假设只有输入矩阵的一个非0行包含非0元素(设置了DFT_INVERSE)或只有输出矩阵的第一个非0行包含非0元素(设置了DFT_INVERSE)。这样的话,函数就可以对其它进行更高效的处理,以节省时间开销,尤其是在计算矩阵卷积时非常有效。
ˇgetOPtimalDFTSize()返回DFT最优尺寸大小
1 int getOptimalDFTSize(int vecsize);
该函数的参数即向量尺寸,图像的rows、cols
ˇcopyMakeBorder()扩充图像边界
1 void copyMakeBorder(InputArray src, OutPutArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar());
ˇ第一个参数:输入的原图像
ˇ第二个参数:输出结果,需和原图片有一样的尺寸和类型,且size大小为Size(src.cols + left + right, src.rows + top + bottom)
ˇ第三~六个参数:向四个方向扩充多少像素,例如top = 2;即向上边界扩充两个像素宽度的边界
ˇ第七个参数:边界类型,常用取值为BORDER_CONSTANT
ˇ第八个参数:默认值Scalar(),标记BORDER_CONSTANT时,改参数表示边界值
ˇmagnitude()计算二维矢量的幅值
1 void magnitude(InputArray x, InputArray y, OutputArray maginute);
ˇ第一个参数:输入的矢量的浮点型X坐标值,即实部
ˇ第二个参数:输入的矢量的浮点型Y坐标值,即虚部
ˇ第三个参数:输出的maginute,与x有相同的尺寸和类型
ˇlog()计算自然对数
1 void log(InputArray src, OuyputArray dst);
ˇ第一个参数:输入的图像
ˇ第二个参数:得到的对数值
ˇnormolize()矩阵归一化
1 void normalize( InputArray src, OutputArry dst, double alpha = 1, double beta = 0, int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray() );
ˇ第一个参数:输入的原图像
ˇ第二个参数:运算结果的存放,与原图像拥有相同大小和类型
ˇ第三个参数:归一后的最大值,默认为1
ˇ第四个参数:归一后的最大值,默认为0
ˇ第五个参数:归一化类型,NORM_L1、NORM_L2、NORM_INF、NORM_MINMUX等
ˇ第六个参数:默认值-1,此时与src类型相同,若设置大于0折与src尺寸相同
ˇ第七个参数:可选的操作掩膜,默认noArray()
三、离散傅里叶变换测试
1 // DTF.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 //采用傅里叶变换将图片从空间域转换到频域 3 // 4 5 #include <iostream> 6 #include <opencv2/core/core.hpp> 7 #include <opencv2/highgui/highgui.hpp> 8 #include <opencv2/imgproc/imgproc.hpp> 9 10 using namespace std; 11 using namespace cv; 12 13 int main(int argc, char** argv) 14 { 15 system("color 2f"); 16 17 //这里必须是灰度图片 18 Mat srcImage = imread("1.jpg", 0); 19 if (!srcImage.data) 20 { 21 cout << "载入图片出错" << endl; 22 return -1; 23 } 24 imshow("原图像", srcImage); 25 26 int m = getOptimalDFTSize(srcImage.rows); 27 int n = getOptimalDFTSize(srcImage.cols); 28 29 Mat padded; 30 copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0)); 31 32 Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; 33 Mat complexI; 34 merge(planes, 2, complexI); 35 36 dft(complexI, complexI); 37 38 split(complexI, planes); 39 magnitude(planes[0], planes[1], planes[0]); 40 Mat magnitudeImage = planes[0]; 41 42 magnitudeImage += Scalar::all(1); 43 log(magnitudeImage, magnitudeImage); 44 45 magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2)); 46 int cx = magnitudeImage.cols / 2; 47 int cy = magnitudeImage.rows / 2; 48 Mat q0(magnitudeImage, Rect(0, 0, cx, cy)); 49 Mat q1(magnitudeImage, Rect(cx, 0, cx, cy)); 50 Mat q2(magnitudeImage, Rect(0, cy, cx, cy)); 51 Mat q3(magnitudeImage, Rect(cx, cy, cx, cy)); 52 53 Mat tmp; 54 q0.copyTo(tmp); 55 q3.copyTo(q0); 56 tmp.copyTo(q3); 57 58 q1.copyTo(tmp); 59 q2.copyTo(q1); 60 tmp.copyTo(q2); 61 62 normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX); 63 imshow("频谱赋值", magnitudeImage); 64 waitKey(); 65 66 67 return 0; 68 }
累了累了休息会
以上是关于动态演示频域采样与时域周期延拓现象的主要内容,如果未能解决你的问题,请参考以下文章
语音处理基于matlab GUI录音与音频时域+频域+倒谱+功率谱分析含Matlab源码 070期