精华内容
下载资源
问答
  • 原理短时傅里叶变换(Short ... 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱.短时傅里叶变换通常的数学定义如下:其中,DTFT (Dec...

    原理

    短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变化的复数幅度. 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱.

    短时傅里叶变换通常的数学定义如下:

    L3Byb3h5L2h0dHBzL2ltYWdlczIwMTguY25ibG9ncy5jb20vYmxvZy83NTcyMDUvMjAxODA3Lzc1NzIwNS0yMDE4MDcwODE2MzgzMzk3OC0xNzg2NzU0Mzg2LnBuZw==.jpg

    其中,

    L3Byb3h5L2h0dHBzL2ltYWdlczIwMTguY25ibG9ncy5jb20vYmxvZy83NTcyMDUvMjAxODA3Lzc1NzIwNS0yMDE4MDcwODE2Mzk0MTE4Mi01MDk1ODYzMTQucG5n.jpg

    DTFT (Decrete Time Fourier Transform) 为离散时间傅里叶变换. 其数学公式, 如下所示:

    L3Byb3h5L2h0dHBzL2ltYWdlczIwMTguY25ibG9ncy5jb20vYmxvZy83NTcyMDUvMjAxODA3Lzc1NzIwNS0yMDE4MDcwODE2NDU0NjA2Mi0zNTQ0MTg5MTEucG5n.jpg

    其中, x(n) 为在采样数 n 处的信号幅度. ω~ 的定义如下:

    L3Byb3h5L2h0dHBzL2ltYWdlczIwMTguY25ibG9ncy5jb20vYmxvZy83NTcyMDUvMjAxODA3Lzc1NzIwNS0yMDE4MDcwODE2NDcxMDI0NS0xMDY1OTE5ODIucG5n.jpg

    实现时, 短时傅里叶变换被计算为一系列加窗数据帧的快速傅里叶变换 (Fast Fourier Transform, FFT),其中窗口随时间 “滑动” (slide) 或“跳跃” (hop) 。

    Python 实现

    在程序中, frame_size 为将信号分为较短的帧的大小, 在语音处理中, 通常帧大小在 20ms 到 40ms 之间. 这里设置为 25ms, 即 frame_size = 0.025;

    frame_stride 为相邻帧的滑动尺寸或跳跃尺寸, 通常帧的滑动尺寸在 10ms 到 20ms 之间, 这里设置为 10ms, 即 frame_stride = 0.01. 此时, 相邻帧的交叠大小为 15ms;

    窗函数采用汉明窗函数 (Hamming Function) ;

    在每一帧, 进行 512 点快速傅里叶变换, 即 NFFT = 512. 具体程序如下:

    # -*- coding: utf8 -*-

    import numpy as np

    def calc_stft(signal, sample_rate=16000, frame_size=0.025, frame_stride=0.01, winfunc=np.hamming, NFFT=512):

    # Calculate the number of frames from the signal

    frame_length = frame_size * sample_rate

    frame_step = frame_stride * sample_rate

    signal_length = len(signal)

    frame_length = int(round(frame_length))

    frame_step = int(round(frame_step))

    num_frames = 1 + int(np.ceil(float(np.abs(signal_length - frame_length)) / frame_step))

    # zero padding

    pad_signal_length = num_frames * frame_step + frame_length

    z = np.zeros((pad_signal_length - signal_length))

    # Pad signal to make sure that all frames have equal number of samples

    # without truncating any samples from the original signal

    pad_signal = np.append(signal, z)

    # Slice the signal into frames from indices

    indices = np.tile(np.arange(0, frame_length), (num_frames, 1)) + \

    np.tile(np.arange(0, num_frames * frame_step, frame_step), (frame_length, 1)).T

    frames = pad_signal[indices.astype(np.int32, copy=False)]

    # Get windowed frames

    frames *= winfunc(frame_length)

    # Compute the one-dimensional n-point discrete Fourier Transform(DFT) of

    # a real-valued array by means of an efficient algorithm called Fast Fourier Transform (FFT)

    mag_frames = np.absolute(np.fft.rfft(frames, NFFT))

    # Compute power spectrum

    pow_frames = (1.0 / NFFT) * ((mag_frames) ** 2)

    return pow_frames

    if __name__ == '__main__':

    import scipy.io.wavfile

    import matplotlib.pyplot as plt

    # Read wav file

    # "OSR_us_000_0010_8k.wav" is downloaded from http://www.voiptroubleshooter.com/open_speech/american.html

    sample_rate, signal = scipy.io.wavfile.read("OSR_us_000_0010_8k.wav")

    # Get speech data in the first 2 seconds

    signal = signal[0:int(2. * sample_rate)]

    # Calculate the short time fourier transform

    pow_spec = calc_stft(signal, sample_rate)

    plt.imshow(pow_spec)

    plt.tight_layout()

    plt.show()

    参考资料

    1. DISCRETE TIME FOURIER TRANSFORM (DTFT). https://www.dsprelated.com/freebooks/mdft/Discrete_Time_Fourier_Transform.html

    2. THE SHORT-TIME FOURIER TRANSFORM. https://www.dsprelated.com/freebooks/sasp/Short_Time_Fourier_Transform.html

    3. Short-time Fourier transform. https://en.wikipedia.org/wiki/Short-time_Fourier_transform

    4. Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What's In-Between. https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html

    Python scipy 计算短时傅里叶变换(Short-time Fourier transforms)

    计算短时傅里叶变换(STFT) scipy.signal.stft(x,fs = 1.0,window ='hann',nperseg = 256,noverlap = None,nfft = Non ...

    matlab 时频分析(短时傅里叶变换、STFT)

    短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...

    傅里叶变换 - Fourier Transform

    傅里叶级数 傅里叶在他的专著<热的解析理论>中提出,任何一个周期函数都可以表示为若干个正弦函数的和,即: \[f(t)=a_0+\sum_{n=1}^{\infty}(a_ncos(n\o ...

    「学习笔记」Fast Fourier Transform

    前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是 ...

    浅谈范德蒙德&lpar;Vandermonde&rpar;方阵的逆矩阵的求法以及快速傅里叶变换&lpar;FFT&rpar;中IDFT的原理

    浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理 标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值 只要稍微看 ...

    短网址&lpar;short URL&rpar;系统的原理及其实现

    短网址(short URL)系统的原理及其实现 https://hufangyun.com/2017/short-url/?hmsr=toutiao.io&utm_medium=toutiao ...

    paip&period;编程语言方法重载实现的原理及python&comma;php&comma;js中实现方法重载

    paip.编程语言方法重载实现的原理及python,php,js中实现方法重载 有些语言,在方法的重载上,形式上不支持函数重载,但可以通过模拟实现.. 主要原理:根据参数个数进行重载,或者使用默认值 ...

    MapReduce 原理与 Python 实践

    MapReduce 原理与 Python 实践 1. MapReduce 原理 以下是个人在MongoDB和Redis实际应用中总结的Map-Reduce的理解 Hadoop 的 MapReduce ...

    随机推荐

    &lbrack;C&num;&rsqb;&period;NET中几种Timer的使用

    这篇博客将梳理一下.NET中4个Timer类,及其用法. 1. System.Threading.Timer public Timer(TimerCallback callback, object s ...

    &lbrack;BZOJ1131&rsqb;&lbrack;POI2008&rsqb; Sta 树的深度

    Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...

    C&num;&lowbar;简单实用的翻页

    简单实用的生成翻页HTML辅助类 C# using System.Text; namespace ClassLibrary { /// /// /// ...

    Equivalent Strings

    Equivalent Strings 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/E 题意: 给出 ...

    IIS-Server is too busy &lowbar;解决方法

    httpRuntime Server Too Busy 修改方法:修改服务器.net配置“machine.config"文件,该文件位于Windows系统目录下,如“C:\WINDOWS \Micro ...

    (译)详解javascript立即执行函数表达式(IIFE)

    写在前面 这是一篇译文,原文:Immediately-Invoked Function Expression (IIFE) 原文是一篇很经典的讲解IIFE的文章,很适合收藏.本文虽然是译文,但是直译的 ...

    ubuntu启动慢

    http://blog.sina.com.cn/s/blog_4cc9ffbc0100rxhh.html 参考 笔记本装的是ubuntu12.04,最近发现开机启动特别慢,至少3分钟,总担心系统会启动 ...

    POJ 1325、ZOJ 1364、HDU 1150 Machine Schedule - from lanshui&lowbar;Yang

    Problem Description As we all know, machine scheduling is a very classical problem in computer scien ...

    一个简单的redis调用类

    能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get ...

    oracle修改字符集后数据库不能启动

    最近在做修改字符集的实验,悲剧的是修改后重启,数据库启动不了. SQL> alter system set nls_language='AMERICAN'   scope = spfile; S ...

    展开全文
  • ADC的过程是在频率编码梯度打开时进行采集,每个采集点值是:变换一下就是:可见采样就直接得到了k空间。每进行一次相位编码,采样一次,得到一行k空间数据,重复这个过程就可以得到足够数据来重建...
    lemon lelieven:MRI原理-信号zhuanlan.zhihu.com

    之前已经得到了MRI的信号公式:

    7b809f337676c5443997eb9813c5d59d.png

    不过这是一个连续的信号,经过A/D转换、采样之类的操作,变成离散信号,才能使用计算机处理。

    75aa7447148cee4081a36eb73ecbfcff.png

    ADC的过程是在频率编码梯度打开时进行采集的,每个采集点的值是:

    347b81e840dc94468e67db29c41cea6f.png

    变换一下就是:

    10de89cc1527116aba006fe5bdc429d9.png

    可见采样就直接得到了k空间。

    每进行一次相位编码,采样一次,得到一行k空间数据,重复这个过程就可以得到足够的数据来重建图像。

    0fdec6f46b94b7ed21866aeb5af96ced.png

    得到K空间之后逆变换就可以得到图像。

    二维的DFT变换对是:

    265baae7c8db38acfedbf92ffb0bf88e.png

    从采样开始,一直到最后的图像重建,基本都是信号处理和数字图像处理的内容,这里不再细说,知乎里有各位大佬的全方位科普。比如,

    阿姆斯特朗:形象理解二维傅里叶变换zhuanlan.zhihu.com
    fd6548e6e579a90668a4f2deaa9bf5ea.png

    再废话几句。

    实际中傅里叶变换的信号有以下几种:

    (1) 时域:有限非周期连续信号,频域:连续信号

    (2) 时域:周期连续信号,频域:离散、无限信号

    (3) 时域:有限、离散信号,频域:连续、周期信号

    (4) 时域:周期、离散信号,频域:离散、周期信号

    第四种情况下,时域、频域只取其中一个周期处理,就是实际处理中的离散傅里叶变换(DFT)。

    实际中,K空间存储的都是复数,二维K空间相当于一个二维复空间,相当于一个4维实空间,实际中是无法画出来的。

    fba97bf16426227f0b0538cb6385a99b.png

    上面的图,大多书告诉你,左边就是K空间。实际左边只是K空间的幅度图,再加上相位图才是完整的K空间。

    下面来几张动图直接感受一下二维傅里叶变换的情况。

    f8c568353bd1c38c04b13716840ce98b.gif

    K空间只有一个点时,对应的图像就是一个明暗变化的条纹,是一个非常单纯的二维波形。中心代表频率为0,往周边频率增高,右侧条纹周期降低,频率增高。并且条纹的方向与左侧点的方向垂直

    a2416ca20c6c4ea2caed3a976f8d4de4.gif

    7a19ba51169a0994bd74e18820e0e5e2.gif

    c1609a5a550aa82b09718813419cdadc.gif

    上面三幅说明了K空间变化对图像的影响。当数据从中心往两边增加时,可以发现先出现图像的亮度,随后才会有完整的组织对比度。,说明低频信息影响图像的轮廓,高频信息影响图像的对比度。从傅里叶变换的频率分解角度来看,也是一致的。

    最后说一个国内医学影像界对K空间和傅里叶变换流传很广的一个错误。

    最早可能来自下面这本书。

    3fe0cf14f28ee5783cfa378dfa9d9af8.png

    c18e397d966593b8b031bafc6a1e3bc1.png

    这是书里第47页的内容,这一大段,明显全错,作者明显不明白傅里叶变换到底时怎么一回事。二维傅里叶变换是两个频率,相位编码只是相当于其中的一个频率。相位编码的次数和频率编码的次数时相互独立的,没有关系。如果继续看这本书后面对K空间的描述,会发现作者把傅里叶变换的相位、成像过程中的相位编码明显当作相位来看,把频率编码当作频率来看。如果有人看过这本书的配套视频,作者似乎也确实时这么认为的,可惜时错的啊。

    本书2008年发行,又是一众国内大佬联合编写,发行量巨大,错误流传也很广。时不时看到有人问为什么傅里叶变换只能区分180°的相位差?当然时作者错了啊,还能为什么。

    最后个人经验来看,不经过手算傅里叶积分,没有亲自算过图像的傅里叶变换,很难说真正懂了K空间和傅里叶变换。

    展开全文
  • 原理短时傅里叶变换(Short ... 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱.短时傅里叶变换通常的数学定义如下: 其中, DTFT (D...

    原理

    短时傅里叶变换(Short Time Fourier Transform, STFT) 是一个用于语音信号处理的通用工具.它定义了一个非常有用的时间和频率分布类, 其指定了任意信号随时间和频率变化的复数幅度. 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱.

    短时傅里叶变换通常的数学定义如下:

    其中,

    DTFT (Decrete Time Fourier Transform) 为离散时间傅里叶变换.  其数学公式, 如下所示:

    其中,  x(n) 为在采样数 n 处的信号幅度. ω~ 的定义如下:

    实现时, 短时傅里叶变换被计算为一系列加窗数据帧的快速傅里叶变换 (Fast Fourier Transform, FFT),其中窗口随时间 “滑动” (slide) 或“跳跃” (hop) 。

    Python 实现

    在程序中, frame_size 为将信号分为较短的帧的大小, 在语音处理中, 通常帧大小在 20ms 到 40ms 之间. 这里设置为 25ms, 即 frame_size = 0.025;

    frame_stride 为相邻帧的滑动尺寸或跳跃尺寸, 通常帧的滑动尺寸在 10ms 到 20ms 之间, 这里设置为 10ms, 即 frame_stride = 0.01. 此时, 相邻帧的交叠大小为 15ms;

    窗函数采用汉明窗函数 (Hamming Function) ;

    在每一帧, 进行 512 点快速傅里叶变换, 即 NFFT = 512. 具体程序如下:

    #-*- coding: utf8 -*-

    importnumpy as npdef calc_stft(signal, sample_rate=16000, frame_size=0.025, frame_stride=0.01, winfunc=np.hamming, NFFT=512):#Calculate the number of frames from the signal

    frame_length = frame_size *sample_rate

    frame_step= frame_stride *sample_rate

    signal_length=len(signal)

    frame_length=int(round(frame_length))

    frame_step=int(round(frame_step))

    num_frames= 1 + int(np.ceil(float(np.abs(signal_length - frame_length)) /frame_step))#zero padding

    pad_signal_length = num_frames * frame_step +frame_length

    z= np.zeros((pad_signal_length -signal_length))#Pad signal to make sure that all frames have equal number of samples

    #without truncating any samples from the original signal

    pad_signal =np.append(signal, z)#Slice the signal into frames from indices

    indices = np.tile(np.arange(0, frame_length), (num_frames, 1)) +\

    np.tile(np.arange(0, num_frames* frame_step, frame_step), (frame_length, 1)).T

    frames= pad_signal[indices.astype(np.int32, copy=False)]#Get windowed frames

    frames *=winfunc(frame_length)#Compute the one-dimensional n-point discrete Fourier Transform(DFT) of

    #a real-valued array by means of an efficient algorithm called Fast Fourier Transform (FFT)

    mag_frames =np.absolute(np.fft.rfft(frames, NFFT))#Compute power spectrum

    pow_frames = (1.0 / NFFT) * ((mag_frames) ** 2)returnpow_framesif __name__ == '__main__':importscipy.io.wavfileimportmatplotlib.pyplot as plt#Read wav file

    #"OSR_us_000_0010_8k.wav" is downloaded from http://www.voiptroubleshooter.com/open_speech/american.html

    sample_rate, signal = scipy.io.wavfile.read("OSR_us_000_0010_8k.wav")#Get speech data in the first 2 seconds

    signal = signal[0:int(2. *sample_rate)]#Calculate the short time fourier transform

    pow_spec =calc_stft(signal, sample_rate)

    plt.imshow(pow_spec)

    plt.tight_layout()

    plt.show()

    参考资料

    1. DISCRETE TIME FOURIER TRANSFORM (DTFT). https://www.dsprelated.com/freebooks/mdft/Discrete_Time_Fourier_Transform.html

    2. THE SHORT-TIME FOURIER TRANSFORM. https://www.dsprelated.com/freebooks/sasp/Short_Time_Fourier_Transform.html

    3. Short-time Fourier transform. https://en.wikipedia.org/wiki/Short-time_Fourier_transform

    4. Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What's In-Between. https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html

    展开全文
  • 基于Matlab 傅里叶变换 绘制图形

    千次阅读 2019-08-15 12:25:10
    之前制作钢琴频谱识别时候,发现傅里叶变换的神奇之处,激起了内心的好奇。前几天在bilibili又发现了用傅里叶变换绘图的视频。决定自己做一个,顺便仔细学习一下傅里叶变换。 过程 从对傅里叶变换一窍不通,到反复...

    起源

    之前制作钢琴频谱识别时候,发现傅里叶变换的神奇之处,激起了内心的好奇。前几天在bilibili又发现了用傅里叶变换绘图的视频。决定自己做一个,顺便仔细学习一下傅里叶变换。

    过程

    从对傅里叶变换一窍不通,到反复学习推导过程,以及自己边做边发现问题,加上自己的思考和参考视频中的讲解,终于对傅里叶变换有了一个比较深刻的理解。

    原理

    对于一个波,对其进行傅里叶变换之后可以得到若干角速度、初相角、大小不同的复数向量。

    复数向量可以以箭头形式在复平面内表示。将这些箭头首尾相连,其运动一端的轨迹便可以在复平面内形成二维图形。

    而此二维图形与输入的波之间有一定联系。

    依据此关系,最终可以用一定的波进行傅里叶变换之后,使变换结果在复平面内绘出对应于原波的图形。

    成果

    演示动图:

     

    程序:

    ps:

            1.需要注意的地方看程序注释。

            2.输入图片需要是单连通的,具体定义可以百度。对于一些多连通的图形,用ps或画图 稍作修改即可成为单连通图形(比如演示中的“A” 和音乐符号)。

            3.图形中尽量不要出现尖锐的角,由于寻找边界的算法很简陋(自己拍脑袋随便想了一下搞出来的),可能会寻到到尖锐处就无法继续。

     

    function fft_draw()
        %picture=imread('C:\Users\zxy\Pictures\Matlab\doo.png');
        picture=imread('timg.png');
        %  1 ,  务必使用  白   底  黑  图  案  的  图片
        %  2,因为只能绘制外轮廓,所以 务必使用  单  连  通  图形
        %  3,图形务必居中( 大致居中即可 )。
        N_point=800;%最终绘制时的采样点数,越大越精细,一般400足够
        N_arrows=1;%显示的向量数;N_arrows=1或超过最大值时,自动取最大值
        show=1;% show=1时显示寻找边界的动画,为其他值时不显示
        cycle=2;% cycle=-1时无限循环显示动画,为n循环显示n次
        
        
        
        picture=RuiHua(picture);%锐化
        data_margin=ShiBie(picture, show);%识别边界
        Show(data_margin,N_point, N_arrows,cycle);
    
        function result=RuiHua(picture)%锐化,保证边界拾取的可靠性
            [width, high,~]=size(picture);
            for i=1:1:width
                for j=1:1:high
                    if picture(i,j,1)<125
                        picture(i,j,:)=0;
                    else
                        picture(i,j,:)=255;
                    end
                end
            end
            result=picture;
        end
    
        function data=ShiBie(picture, show)
            %识别边界,得到边界点在图像中的坐标的数组(Xi,Yi),其中i=1,2,3...n
            [width, high, ~]=size(picture);%获取图片宽度、高度
            high_find=round(high/2);%从图片1/2高度开始寻找边界点
            width_find=0;
            %边界识别的起始点
            for i=2:1:width-3
                if abs( picture(high_find,i,1)- picture(high_find,i+1,1))>125 && width_find==0
                    %如果红色R(red)数组中,左侧点的亮度值 与 右侧点亮度值 的差 大于 125,则认为此处是边界。
                    %并记录此处坐标(high_find,width_find).记录的是边界上-内侧-的点的坐标
                    width_find=i+1;
                end
            end
            margin=[high_find ,width_find];%边界点坐标数组,第一个点的坐标
            picture_show=imshow(picture);
            pause(2);
            %开始识别边界
            while picture(high_find,width_find ,3)-picture(high_find,width_find ,2)<100
                %在经锐化的黑白图中,每个点RGB值只可能是(255,255,255)或(0,0,0).
                %--如果出现例如(0,0,255)的情况,说明这个点已经被标记过。
                %--又因为图形区域是单连通区域。再次遇到已经被标记过的点,说明所有边界已经识别完成
                picture(high_find, width_find , 3)=255;
                %将B(RGB的R)数组值改为(255),RG保持不变(0,0),作为已经被记录的边界点的标志。
                if show==1
                    picture(high_find-1:high_find+1,width_find-1:width_find+1 , 1)=255;
                    %将识别点上下左右1的范围内的点的 R值全置为255,显示边界更明显
                    set(picture_show,'Cdata',picture);
                    pause(0.001);
                end
                for i=0:0.7854:5.5  % 0.7875 ~ pi/4
                    x_find_1=width_find+round(cos(i ) );
                    y_find_1=high_find+round( sin(i ) );
                    x_find_2=width_find+round(cos(i + 0.7854) );
                    y_fing_2=high_find+round( sin(i + 0.7854 ) );
                    %围绕上一次的识别点,从右侧开始,逆时针方向依次对比相邻两个点的 B值
                    %如果 B 值出现大幅下降,说明此处是边界,且较小值所在点是图形内侧。
                    if picture(y_find_1, x_find_1, 2) -picture(y_fing_2, x_find_2, 2) >125
                        high_find=y_fing_2;
                        width_find=x_find_2;
                        margin=[margin ;high_find,width_find];%记录新的边界点的坐标
                    end
                end
            end
            data=margin;
        end
    
        function Show(data_margin, N_point, N_arrows,cycle)
            [N,~]=size(data_margin);%边界点数
            data_point=zeros(N_point,2);
            
            arrows=plot([0 0],[0 0],'marker','.','color','b');hold on;%箭头
            orbit=plot([0 0],[0 0],'r');%轨迹
            
            xdata_X=zeros(1,2*N);
            ydata_X=xdata_X;
            xdata_Y=xdata_X;
            ydata_Y=xdata_X;
            
            data_margin=data_margin/100;
            data_margin(: ,1)=data_margin(: ,1) - data_margin( 1,1);%平移图形,使起/止点坐标为(0,0)
            data_margin(: ,2)=data_margin(: ,2) - data_margin( 1,2);
            data_X=fft(data_margin(:,1));%对 x 傅里叶变换
            data_Y=fft(data_margin(:,2));%对 y 傅里叶变换
            [n, ~]=size(data_X);
            ct=zeros(1,n);%各阶向量的初始角速度
            
            
            limt=max(abs(data_X)*0.7);%控制绘出图形的显示大小
            xlim([-limt limt]);
            ylim([-limt limt]*0.8);
            
            n=round(n/2);%阶数,傅里叶变换得到的是对称数组,取一半
            if N_arrows==1 || N_arrows>n
                N_arrows=n;
            end
            corner=zeros(n,2);
            
            while cycle==-1 || cycle>0
                if cycle>0
                    cycle=cycle-1;
                end
                
                for n_point=1:1:N_point
                    for i=1:1:n
                        ct(i)=ct(i)+(i-1)/N_point;%角速度
                        %理论上ct(i)= 0,pi, 2pi, 3pi ... npi
                        %在此比例为0:1:2:3:...n即可,具体大小只影响动画速度
    
                        if n_point==1 %--------------------------- x(t) ----------------------
                            if abs( data_X( i ) )>0
                                if imag(data_X( i) )>0
                                    corner(i,1 )=acos( real(data_X(i))/abs(data_X(i))  );
                                    %用傅里叶变换得到的复平面向量计算初始转角
                                else
                                    corner( i ,1 )=-acos( real(data_X(i))/abs(data_X(i))  );
                                end
                            else
                                corner(i,1 )=0;
                            end
    
                            if abs( data_Y( i ) )>0 %   ---------------------- y(t) ----------------------
                                if imag(data_Y( i) )>0%初始转角
                                    corner(i ,2 )=acos( real(data_Y(i))/abs(data_Y(i))  );
                                else
                                    corner(i ,2 )=-acos( real(data_Y(i))/abs(data_Y(i))  );
                                end
                            else
                                corner(i ,2 )=0;
                            end
                        end
    
    
                        if i>1%  ------------- x(t) ---------------
                            %对于X而言,只需要x方向的运动,因此需要附加一个反向运动的向量 将y方向的运动抵消
                            xdata_X( i*2-1 )= 0.1*abs(data_X(i)) * cos( 2*pi*ct(i) + corner( i ,1 ) )+ xdata_X( i*2-2 );
                            xdata_X(  i*2 )=0.1*abs(data_X(i)) * cos( -2*pi*ct(i) - corner( i ,1 ) )+ xdata_X( i*2-1);
                            ydata_X( i*2-1 )=0.1*abs(data_X(i)) * sin( 2*pi*ct(i) +corner( i ,1 ) ) + ydata_X( i*2 -2 );
                            ydata_X( i*2 )=0.1*abs(data_X(i)) * sin( -2*pi*ct(i) -corner( i ,1 ) ) + ydata_X( i*2-1);
                        else
                            xdata_X(i)=0.2*abs(data_Y(i)) * cos( corner( i ,1 ) );
                            ydata_X(i)=0;
                        end
    
                        if i>1% ------------y(t) ----------------
                            %对于Y而言,只需要y方向的运动,因此需要附加一个反向运动的向量 将x方向的运动抵消
                            xdata_Y( i*2-1 )=-0.1*abs(data_Y(i)) * sin( 2*pi*ct(i) + corner( i ,2 ) )+ xdata_Y( i*2-2 );
                            xdata_Y(  i*2 )=-0.1*abs(data_Y(i)) * sin( -2*pi*ct(i) - corner( i ,2 ) )+ xdata_Y( i*2-1);
                            ydata_Y( i*2-1 )=0.1*abs(data_Y(i)) * cos( 2*pi*ct(i) +corner( i ,2 ) ) + ydata_Y( i*2-2 );
                            ydata_Y( i*2 )= 0.1*abs(data_Y(i)) * cos( -2*pi*ct(i) -corner( i ,2 ) ) + ydata_Y( i*2-1);
                        else
                            xdata_Y(i)=0;%
                            ydata_Y(i)=0.2*abs(data_Y(i)) * cos( corner( i ,2 ) );
                        end
    
                    end
                    x_draw=xdata_X(1:N_arrows) + xdata_Y(1:N_arrows) ;
                    y_draw=ydata_X(1:N_arrows)+ydata_Y(1:N_arrows);
                    data_point(n_point,:)=[y_draw(N_arrows) -x_draw(N_arrows)];
                    set(arrows,'xdata',y_draw(2:N_arrows)  ,'ydata', -x_draw(2:N_arrows));
                    set(orbit,'xdata', data_point(1:n_point,1) ,'ydata', data_point(1:n_point,2) );
                    pause(0.009);
                    drawnow;
                end
            end
        end
    end

     

    展开全文
  • 提出一种基于分数傅里叶变换和随机相位编码光学加密数字水印技术,可成为一种信息隐藏及保护有效方案。该数字水印技术对于噪音叠加常见图像处理操作具有较强稳健性。该技术根据光学级联分数傅里叶变换系统,...
  • 离散傅里叶变换DFT基本原理图解

    万次阅读 2016-03-31 17:00:20
    看到解释DFT基本原理的,认为讲挺好,虽然在信号与系统里也学过类似图,但没有对比,有些东西领会不深,这个通过对比不同时间窗、不同采样率对频谱泄露影响等,讲很好,然后我进一步发挥,对比了矩形窗...
  • 原理  短时傅里叶变换(Short ... 实际上,计算短时傅里叶变换的过程是把一个较长的时间信号分成相同长度的更短的段, 在每个更短的段上计算傅里叶变换, 即傅里叶频谱. 短时傅里叶变换通常的数学定义如下: 其中...
  • 虚部为0),将变换输出实部放回原来第1行实部,将输出虚部放回第1行虚部,这样计算完成全部行之后,图像实部虚部包含是中间数据,然后用相同办法进行列方向上相同的傅里叶变换,这样大小为MN...
  • 基二FFT基本原理1.1 快速傅里叶变换1.2 常用FFT算法1.2.1 时域抽取(1) 实现过程(2)运算规律及编程思想原位计算旋转因子距离码位颠倒1.2.2 频域抽取(1) 运算规律比较(2)运算量比较2. Matlab实现本文结束,...
  • 介绍了闭环反馈控制法稳定法布里珀罗型光纤水听器相位工作点基本原理,给出了法布里珀罗型光纤水听器声压相移灵敏度表达式,推导了法布里珀罗干涉透射光强替代函数的傅里叶变换解析式,用MathCAD软件绘制了该式...
  • 离散傅里叶变换(DFT)数学例子

    千次阅读 2018-04-11 08:58:59
    本篇博客主要是举个实例来展示离散傅里叶变换的计算过程(因为计算机主要是处理离散数值)。具体的傅里叶变换原理可以参考知乎专栏上的一篇文章,讲的很好:...
  • 3.2短时傅里叶变换 语音感知过程与人类听觉系统具有频谱分析功能紧密相关。因此,对语音信号进行频谱分析,是认识处理语音信号重要方法。 声音从频率上可以分为纯音复合音: 纯音只含一种频率声音(基音)...
  • 时间拉伸色散傅里叶变换(TS-DFT)技术推动了锁模激光器中瞬态现象研究,对于揭示复杂系统中耗散动力学过程具有重要意义。介绍了TS-DFT技术基本原理及其在数据采集数据处理中存在关键问题,总结了TS-DFT技术...
  • 假设B.shape=[100,100],A.shape=[50,50],卷积过程得到shape为[149,149] 卷积过程=翻转+加权+滑动;...卷积过程可以使用离散傅里叶变换计算,复杂度降低(具体原理没有弄明白)。 代码: ...
  • 在虚拟光学数据加密理论基础上,基于光学4f系统及迭代傅里叶变换算法(IFTA),提出利用多个相位板进行分级图像加密方法,将不同密级图像分别加密到不同相位板中,给出其理论原理和实现方法,并通过计算机模拟验证...
  • 2、2018年4月建号以来,已陆续完成了PCB系列培训视频更新,相关PCB设计原创文章撰写,主要基于Cadence Allegro PCB Design GXLOrCAD Capture CIS,版本号16.6,基本覆盖了从原理图设计(OrCAD Capture CIS)...
  • t随机邻域嵌入( )是一种成功用于降维可视化高维数据集方法。 t-SNE一种流行是使用Barnes-Hut算法在每次梯度下降迭代时近似梯度。 我们加快了实现过程,如下所示: N体模拟计算:我们不是使用Barnes-Hut...
  • 主要内容:采样定理介绍采样过程和实现频谱混叠产生的原理本文小结后续参考资料一,什么是采样?简单地理解就是:把模拟信号转换为计算机可以处理的数字信号的过程。下面是大名鼎鼎的采样定理:在进行模拟/数字信号...
  • word教育资料 实验三 快速傅里叶变换及其应用 一:实验目的 加深对FFT理解熟悉matlab中有关函数 应用FFT对典型信号进行频谱分析 了解应用FFT进行信号频谱分析过程中可能出现问题以便在实际中正确应用FFT....
  • 主要内容:采样定理介绍采样过程和实现频谱混叠产生的原理本文小结后续参考资料一,什么是采样?简单地理解就是:把模拟信号转换为计算机可以处理的数字信号的过程。下面是大名鼎鼎的采样定理:在进行模拟/数字信号...
  • 详细讨论了高光谱Mueller矩阵成像的原理以及双折射干涉器剪切干涉成像过程,对偏振态发生器/偏振态分析器进行了联合优化设计,给出了系统的定标方法。为验证仪器的性能,在实验室对目标进行光谱Mueller矩阵成像,证明了...
  • 本文默认您已经学习过高等数学的相关知识,知道傅里叶变换的原理和概念、了解时域/频域的概念。1、傅里叶变换傅里叶变换是将一个时域信号用不同频率/相位的三角波函数进行拟合。过程如上图所示,最左边的是原始信号...
  • 本文默认您已经学习过高等数学的相关知识,知道傅里叶变换的原理和概念、了解时域/频域的概念。1、傅里叶变换傅里叶变换是将一个时域信号用不同频率/相位的三角波函数进行拟合。过程如上图所示,最左边的是原始信号...
  • FFT原理——详细推导理解FFT变换

    千次阅读 2020-05-14 20:48:05
    频谱分析是信号处理中重要环节,从傅里叶变换FT,到拉普拉斯变换LT,离散时间傅里叶变换DTFT,Z变换ZT,到我们所讲离散傅里叶变换DFT(他们之间联系区别见我其他博客)。 相比于其他变换
  • 一,前期回顾上期我们主要讲了快速傅里叶变换原理和实现过程几个小问题。对时域连续信号进行了采样,将时域连续信号变为了离散信号并进行傅里叶变换,我们神奇发现在频域中还是连续谱线,PC 处理不了。在...
  • 一,前期回顾上期我们主要讲了快速傅里叶变换原理和实现过程几个小问题。对时域连续信号进行了采样,将时域连续信号变为了离散信号并进行傅里叶变换,我们神奇发现在频域中还是连续谱线,PC 处理不了。在...
  • 混频原理

    万次阅读 多人点赞 2018-03-22 10:55:11
    而复信号则只有单边频率分量,正余弦复信号的的傅里叶变换频率分量:四种信号频谱图如下:混频器是一个三端器件,两个输入一个输出,输出信号等于输入信号乘积,时域乘积对应于频域卷积,过程可推算如下:...
  • 一,前期回顾上期我们主要讲了快速傅里叶变换原理和实现过程几个小问题。对时域连续信号进行了采样,将时域连续信号变为了离散信号并进行傅里叶变换,我们神奇发现在频域中还是连续谱线,PC 处理不了。在...
  • 1.2 与短时傅里叶变换的比较 1.3 连续小波变换的一些性质 1.4 小波变换的反演及对基本小波的要求 1.5 连续小波变换的计算机实现与快速算法 1.6 几种常用的基本小波 1.7 应用举例 第二章 尺度及位移均离散化的...
  • 掌握离散傅里叶变换的有关性质 利用matlab验证有关性质 利用傅立叶变换进行相关运算二实验原理及方法 在工程技术的许多分支中要掌握的基本内容之一就是正确理解时域频域的关系对于数字系统来说就是要精通离散傅立...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

傅里叶变换的原理和过程