精华内容
下载资源
问答
  • 声光频谱仪频率分辨率判断方法研究
  • 首先,将含有频谱价格、与频谱有关的非价格正向属性值作为频谱竞标人的竞标方案并执行拍卖判断频谱赢家。其次,为确保频谱拍卖的安全性,方案利用 Paillier 门限机制引入一组拍卖人的分治集中式频谱拍卖服务器代替...
  • 利用认知无线电中频谱的稀疏性,将压缩感知技术用于宽带信号频谱检测,通过少量的压缩数据能够判断频谱是否空闲是一种有效解决这个问题的方法。文中首先建立宽带频谱压缩感知的模型,并提出一种多感知节点多尺度检测...
  • 频谱解析_频谱

    2020-09-29 19:58:07
    频谱解析#frameworksoflife #frameworksoflife Friends sometimes remarked how excited and happy I was about my job. I used to nod my head and downplay it. Guilt and pride surfaced at the same time for ...

    频谱解析

    #frameworksoflife

    #frameworksoflife

    Friends sometimes remarked how excited and happy I was about my job. I used to nod my head and downplay it. Guilt and pride surfaced at the same time for loving what I do. Then, I would spend some time reflecting on why didn’t everyone feel the same way about their job?

    朋友有时会说我对自己的工作感到兴奋和高兴。 我曾经点点头,轻描淡写。 为了爱我所做的事,内和自豪感同时浮出水面。 然后,我会花一些时间思考为什么每个人对工作的感觉都不一样?

    Questioning friends about their passions became the only tool I had to help them find a career fueled by drive. I inquired as if there was a flowchart of key decisions to take, as if there was a magic formula. I insisted because I deeply believed that everyone should find a path to a fulfilling career, simply because my life felt that way.

    向朋友询问他们的激情成为我帮助他们寻找动力推动的职业的唯一工具。 我询问是否有一个关键决策流程图,好像有一个神奇的公式。 我之所以坚持,是因为我深信每个人都应该找到一条成就事业的道路,仅仅是因为我的生活就是这样。

    Since that really didn’t work for helping my friends, I started observing and trying to figure out what motivates me. How do I push myself for high quality work? What keeps me from complaining? How do I stay engaged in what I do?

    由于那对帮助我的朋友确实没有用,所以我开始观察并试图找出促使前进的动力。 如何推动自己从事高质量的工作? 是什么让我免于抱怨? 我如何继续从事我的工作?

    After a few years of working in differently sized organizations and cultures, I am discovering that a fulfilling career is a series of choices, but not necessarily the ones we think — like changing jobs, asking for a raise, or being promoted — but about the choices we make everyday when we show up to work.

    在不同规模的组织和文化中工作了几年之后,我发现职业生涯是一系列选择,但不一定是我们认为的选择(例如换工作,要求加薪或被提拔),而是关于我们每天上班时都会做出的选择。

    A fulfilling career is a spectrum, not a ladder. It’s about how we move through it everyday, as designers, as partners, as humans. On one side of the spectrum we have frustration and on the opposite hunger.

    充实的职业是频谱,而不是阶梯。 这是关于我们每天如何以设计师,合作伙伴和人类的身份进行移动。 一方面,我们感到沮丧,而另一方面却感到饥饿。

    Image for post

    沮丧的设计师 (The frustrated designer)

    A frustrated designer is someone who is tired of everything at work. She looks around and complains every chance she has, sometimes it’s about her boss, sometimes her co-workers, other times, her clients. The tasks she’s been given are often boring and banal. She’s lost hope in the leadership and believes life happens outside the office. She lives for the weekends. She tells herself she deserves that glass of wine before bed, that today is ok to skip that yoga class. She is tired, sleepy, out of energy — or so she says. She’s exhausted because her scarce energy is used in finding things that are wrong.

    沮丧的设计师是一个对工作中的一切都感到厌倦的人。 她环顾四周,抱怨自己有机会,有时是关于老板,有时是同事,其他时候是客户。 给她的任务通常很无聊和平庸。 她对领导层失去了希望,并相信生活在办公室之外。 她在周末住。 她告诉自己,她应该在睡前喝杯酒,今天可以跳过瑜伽课。 她疲倦,困倦,精力不充沛-或如此说。 她之所以精疲力尽,是因为她稀缺的精力用于发现错误的事物。

    She dreads Mondays. She avoids talking about the aspects of her work that she enjoys, because they are overshadowed by the tyrannic people she thinks she works with. She sometimes says “It’s not my problem, I just do the mockups.” Once in a while, she rolls her eyes while saying “I don’t know, that is way above my pay grade.” Some days she believes she is burnt out and that she must switch professions. She reads job descriptions online and imagines how her life would be much better in that utopian place.

    她星期一很害怕。 她避免谈论自己喜欢的工作,因为她认为与她一起工作的暴虐者盖过了这些方面。 她有时说: “这不是我的问题,我只是做模型。” 有时 ,她翻白眼说: “我不知道,那比我的薪水高了很多。” 某些时候,她认为自己已经精疲力尽,因此必须转行。 她在网上阅读工作说明,并想象在那个乌托邦式的地方生活会好得多。

    Image for post

    She avoids responsibility and steers clear of uncomfortable conversations. She finds peace in knowing that she did everything that was in her hands, even though she knows she stripped her hands bare from conflict early on. What surrounds her is blame, lack of commitment, and mostly fear. Fear of transforming, of becoming, of evolving, of falling out of love, of closing a chapter. Fear that she is not enough.

    她回避责任,避免不愉快的谈话。 即使知道自己尽早摆脱了冲突,她也知道自己做了所有的事情而感到安宁。 围绕她的是责备,缺乏承诺以及恐惧。 害怕改变,变得,发展,脱离爱恋,结束一章。 担心她还不够。

    But beware, frustrated designer, fury is toxic.

    但是要当心,沮丧的设计师,愤怒是有毒的。

    饥饿的设计师 (The hungry designer)

    A hungry designer is someone who wakes up with the desire to go to work, to out-do herself. She does things that nobody asked her to, and often surprises people around her. Some people think she is competing against them, but truth be told, she is only competing with her yesterday’s self.

    饥饿的设计师是那些渴望上班,超越自我的人。 她做着没人要她做的事情,常常使周围的人感到惊讶。 有人认为她正在与他们竞争,但说实话,她只是在与自己昨天的自我竞争。

    She focuses on mastering the ordinary tasks, because she knows these will save her time in the future. She loves to leave space for the complex things she’s never done before; diving fully, completely, and wholeheartedly into the unknown. When she is blocked, she pats herself on the back, and tries again, promising herself she will give it an honest chance.

    她专注于掌握普通任务,因为她知道这些任务可以节省将来的时间。 她喜欢为以前从未做过的复杂事情留出空间; 全心全意地潜入未知世界。 当她被挡住时,她会拍打自己的背部,然后再次尝试,向自己保证会给自己一个诚实的机会。

    She is proactive, sometimes too much. She doesn’t stop with a simple no, she searches for the why. She craves the big picture, so she can own a piece. She tries her best to deliver not only what was asked, but also to adjust to what is best for that given moment. She understands her clients as if they were eternal user interviews: understanding, open, but oriented towards a specific goal.

    她很主动,有时太多。 她并没有简单地拒绝,而是寻找原因。 她渴望了解大图景,因此可以拥有自己的作品。 她不仅会尽力提供所要求的内容,而且还要适应当前特定的最佳状态。 她将客户理解为永恒的用户访问:理解,开放,但针对特定目标。

    Image for post

    She is vocal and unafraid of candid conversations. She asks for clarity — often. She is relentless, sometimes selfish, and to some she seems overly ambitious. A woman of stamina. Even though she knows being hungry requires time for herself, to recharge and refuel, she sometimes drains herself only to keep pushing.

    她声音直率,不惧怕坦率的谈话。 她经常要求澄清。 她无情,有时自私,在某些人看来她过于野心勃勃。 一个耐力的女人。 即使她知道饥饿需要时间,也要给自己充电和加油,但有时她会竭尽所能以继续前进。

    But beware, hungry designer, famine is taxing.

    但是要当心,饥饿的设计师,饥荒在加重税。

    所以呢… (So what…)

    To the frustrated designer, I must tell you, to be truthful. To your uttermost self. Shed that afraid being that is possessing you. Shake your body until you’re back, feeling something else other than anger and mistrust. Be blunt and intimately honest. Play your favorite tune, and move from that lonely dune. Come back to yourself through doing, heal yourself with action. Know that under the struggle mask you’re wearing, you can only come back to yourself by daring.

    对于沮丧的设计师,我必须告诉你,说实话。 为了你自己 摆脱拥有你的恐惧。 摇晃身体,直到回来为止,除了生气和不信任之外,还会感到别的事情。 坦白和坦诚相待。 播放您最喜欢的曲调,然后从那个寂寞的沙丘中移动。 通过做做回到自己身上,用行动治愈自己。 要知道在戴着的斗争面具下,你只能大胆地回到自己身边。

    To the hungry designer, I must tell you, to be kind. To your uttermost self. To that relentless firecracker inside you. Take the time to decompress, slow down, and observe in silence. Retrospect with a loving, tender eye, creating space for the new, while assimilating your current view. Let your judgement stay at bay, and sigh to all you did or didn’t do today. Tomorrow will be a better day.

    对于饥饿的设计师,我必须告诉你,要友善。 为了你自己 向你内心那无情的鞭炮。 花时间解压缩,放慢速度并保持沉默。 怀着温柔而温柔的眼光进行回顾,为新事物创造空间,同时吸收当前的观点。 让您的判断力停滞不前,并对您今天所做或未做的一切感叹。 明天将是美好的一天。

    Regardless of who you are at this exact moment, take time to often check in with yourself and understand where you are on the spectrum. You won’t always be in the extreme ends, and that’s ok. Ask yourself where you are, and acknowledge it, feel it. Then, decide which side you want to move towards.

    无论您现在是谁,都要花时间经常与自己核对一下,并了解自己在频谱上的位置。 您不会总是处于极端状态,这没关系。 问问自己自己在哪里,并承认它,感受它。 然后,决定要移向哪一侧。

    翻译自: https://blog.prototypr.io/the-spectrum-2674b11f4511

    频谱解析

    展开全文
  • 频谱感知的任务在于利用感知节点(无线传感器或者认知用户)采集的数据判断频谱空洞是否存在。基于最大特征值检测(MED)和最小特征值检测(SED)的方法最近被应用到频谱感知当中。这两种算法在检测实际应用当中普遍存在的...
  • 次用户根据频谱态势信息判断自身所处环境,选择overlay或者underlay接入方案,以最大化容量为准则推导了最优功率分配方案理论,仿真分析表明,该方案性能明显优于传统的检测避让方法,有效提高了系统容量。
  • 通过信号的波形判断信号的频率分量,对于调试电路非常有帮助;虽然我们更习惯于通过示波器从时域来观察信号,如果熟练从频域理解信号,对于我们电路的搭建以及改进也是非常重要的。今天我们就来看一些典型信号的时.....

    “时域”和“频域”是观察电信号的两个维度,也是我们工程师的两只眼睛👀。我们电子工程师每天处理的就是“信号”,无论多复杂的信号都可以通过傅立叶变换分解成多个不同幅度/频率/相位的单频信号的叠加。通过信号的波形判断信号的频率分量,对于调试电路非常有帮助;虽然我们更习惯于通过示波器从时域来观察信号,如果熟练从频域理解信号,对于我们电路的搭建以及改进也是非常重要的。

    今天我们就来看一些典型信号的时域频域都是什么样子。

    9db29dd09089669edd55534ab8f9ea86.png

    0度相移的单频波 - 正弦波

    f7802885be4587423d071df0b4fc10fb.png

    有了相移的单频波 - 正弦波/余弦波

    73e26fd307e82424006cfcb3c49b7500.png

    有了相移的单频波 - 用幅度和相位表示

    8bad6d9f119676e9b69e109121138b28.png

    锯齿波

    a15e16188361ca8ef017d7b3b2a1e05d.png

    三角波

    40981e15ffc768b2c26548cf1f628412.png

    三角波 - 频谱用对数来表示

    134684f6ab3ae90bb1da11d6cc56c656.png

    方波

    736bb3042d084cb11fb34859fba1fe94.png

    在音频上叠加很小幅度的高频信号(相差26dB),听起来就会很刺耳。 我们耳朵能够分辨近130dB动态范围的声音。

    68c05f3658cf00351b3d37dba85335fc.png

    噪声频谱 - 随机的不同频率的周期性噪音叠加在一起

    0d095ef81c13846ba8eddb1fa64c574c.png

    幅度量化 - 较高分辨率

    bfcd626800625a0f38b8a1deaa15e4ef.png

    幅度量化 - 较低分辨率

    06002f03369349185c7101fa83071e3c.png

    时间量化导致的混叠 - 较高转换率

    5a733772ec33fd9fc262e93631ede881.png

    时间量化导致的混叠 - 较低采样率

    ab6ac43f37cb4fcc932d63eb6d06eaf9.png

    正弦波被钳位(削顶、饱和)

    ecdbf83bf57e94a9fb71a8e37cb45f70.png

    正弦波被深度钳位

    e9984e9bef293c2596cfa8b03f020313.png

    正弦波半波整流

    f340c30164e55ee4f1ee7da646113777.png

    正弦波全波整流

    c7fa054e31ceb68beda6dd58dde986bb.png

    锯齿波频谱

    5938eac825174558ee44a5e9886ebbd5.png

    锯齿波被全波整流成了三角波的频谱

    0e09f7a4cca9bf5a38d199c051d07244.png

    相差10Hz的两个频率叠加在一起的波形

    fb3208513204bad8536a771789de840f.png

    对方波施加低通滤波后的波形,LPF的截止频率较低

    a283fe3b21d5aa122ff7beed74addaa2.png

    对方波施加低通滤波后的波形,LPF的截止频率变高

    fad571e309746d3bda3d19d110d7bbdb.png

    对三角波施加低通滤波后的波形

    beda75d2e020110fbe1005ba90e4164a.png

    对锯齿波施加低通滤波后的波形

    8a85d5d2f964ee2dab9d63e4eca4bfdb.png

    对方波施加高通滤波器之后的波形

    c027ee9f946db356950fadc087b3a35f.png

    对三角波施加高通滤波器之后的波形

    67d7abf2aeb679105a6283d0871bc012.png

    对锯齿波施加高通滤波器之后的波形

    89172fb1e3648aa6129dcce1a6027a2e.png

    再看一下噪声的频谱

    7b3f88220bf94a72c4f57770051a6060.png

    对宽谱的噪声施加高通滤波器之后的波形 - 抑制掉低频分量

    a2ca31fd262030a51b4216a628489946.png

    只剩下少许的较高频率的噪声

    展开全文
  • 频谱频谱密度

    千次阅读 2016-10-09 20:53:00
     (1)周期性方波偶函数的频谱函数:Vζ/T Sa(n∏ζ/T)(偶函数图像),高V 宽ζ,频谱零点为 2∏/ζ , 4∏/ζ, 6∏/ζ...  (2)周期性方波非偶:频谱函数是复数表达式。   非周期性的功率信号: 可以看做T→...

    点拨:

    (1)本节的重点不是怎么求傅里叶变换或者傅里叶级数,而是了解掌握 常见的信号 的傅里叶变换,所以 解题时用的方法都是常见的角度 公式 和技巧。

    将时域转换成频域,为了便于分析。学习第一章 (确知信号)也是为了后面章节(第二章 随机过程)的学习做准备。

    确知信号 有明确的时域表达式,随机过程没有明确的时域表达式,所以 可以将信号分为确知信号和随机信号 没有交叉的两大类。

    (2)看到一个确知信号的时域表达式,需要先判断是功率信号还是能量信号吗?视情况而定。有的信号需要求它的能量,如果能出来,那就是能量信号;有的信号就是常见的信号,知道它的图像,就可以直接判断是什么类的信号了。但是,但大部分情况下的计算,不需要考虑它是什么信号,直接用傅氏变换的相关性质计算就可以了。所以,根据问题来思考需要考虑什么---再强调一遍!根据命题人的意图来做题!。

    1.

    欧拉公式:   cosx=(1/2 )[e^jx + e^(-jx)]     sinx= (1/2j) [e^jx - e^(-jx)]

    抽样函数:   Sa(x)=sinx/x,limx=0 sinx/x=1

    分部积分:  ∫ba  F1 (x)F2(x)dx =  [F1(x)F2(x)]ba   ∫bF1(x)F2’(x) dx

    换元积分:(dw时)2∏nf0=w0 (dt时不用), df=(1/2∏) dw

    2.功率信号- 周期信号 - 频谱函数:F(w)~w

    (1)频谱函数(f(t)的傅里叶级数的系数): F(f)=F(nf0)=(1/T)∫(-½T)(½T)  f(t) e^(-j2∏nf0t) dt       (f=nf0)

    (2)周期信号(的傅里叶级数):              f(t)=Σ-∞  Fn e^(j2∏nf0)

    周期信号的频谱函数Fn是离散的,只有在f0的整数倍上取值。

    周期性方波:

              (1)周期性方波偶函数的频谱函数:Vζ/T Sa(n∏ζ/T)(偶函数图像),高V 宽ζ,频谱零点为 2∏/ζ , 4∏/ζ, 6∏/ζ...

              (2)周期性方波非偶:频谱函数是复数表达式。

     

    非周期性的功率信号:可以看做T→∞,但是一般积分很难积出来

    3.能量信号- 非周期信号 -频谱密度函数:频率密度的谱 :能量信号f(t)↔频谱密度函数F(w)

                     非周期信号:冲激信号,门函数,直流信号

       (1)能量信号f(t)↔频谱密度函数F(w)

                 f(t)的傅里叶变换是F(f):   F(f)=-∞  f(t) e^(-j2∏ft) dt      (f=nf0)-----------因为调频调的是f,所以记住重点关于f的公式形式,w的形式可很快的推导

                 【F(f)的逆傅里叶变换是f(t)】:  f(t)= -∞  F(f) e^(j2∏ft) df         

            即       

                  【F(w)的逆傅里叶变换是f(t):】 (时域) f(t)=(1/2∏) -∞  F(f) e^(jwt) dw      

                  f(t)的傅里叶变换是F(w):  (频域)   F(w)=-∞  f(t) e^(-jwt) dt          注意:因为是对t积分,所以没有换元积分,所以直接2∏f=w

          即

                时域<-->频域

       (2)矩形脉冲:  高不一定为1(高为A的脉冲,矩形的,宽度ζ)

              单脉冲: 门函数 ga(t)的频谱密度= Aζ Sa(wζ/2),零点是 1/ζ,2/ ζ, 3/ζ,...-------ga(t)↔Aζ Sa(∏fζ) =Aζ Sa(wζ/2)     

                                                  注意:I.如果是Ga(w)~w图像,w=2∏f,频谱零点w=2∏/ζ,4∏/ζ,...

                        II.频谱的第一个零点=时域信号的  2pi*高/宽度   

             周期性冲击串:∑A ga(t-nT)  ↔/

     

    (3)(单位)冲激函数δ(t)(高为1)的频谱密度  =1 (叫 均匀谱,又叫白色谱)--------------------------即  δ(t)↔1

                                         注意:δ(t)是偶函数。所以δ(t-t0)=δ(t0-t)     

                                         δ函数在t=t0对f(t)的抽样f(t0)   =-∞  f(t)δ(t-t0) dt  ,证明:

                                                  -∞  f(t)δ(t-t0) dt  =  ∫-∞  f(t)δ(t0-t) dt = ∫t0-t0+  f(t)δ(t0-t) dt = t0-t0+  f(t0)δ(t0-t) dt =f(t0)t0-t0+ δ(t0-t) dt = f(t0)

    (4)直流信号f(t)=1 的频谱密度= 2∏ δ(w)-----------------------即1  2∏ δ(w)                                  

    (5)功率信号(只说周期信号)的频谱密度:认为T→∞,引入冲激函数表示频谱

     

            I(周期信号)余弦信号 f(t)=cos 2∏f0t =  cos w0t =(1/2) [e^jw0t + e^(-jw0t)]  ↔  ∏[δ(w-w0)+δ(w+w0)]

            II(周期信号)正弦信号 f(t)=sin 2∏f0t =  sin w0t =(1/ 2j) [e^jw0t - e^(-jw0t)]  ↔  (∏/j)[δ(w-w0)-δ(w+w0)]-----是复数,带相位j,所以一般不选用。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    傅里叶变换性质

    1.对称性:   f(t)↔F(w) 

                     F(t)↔2∏ f(-w)             ------时域有限↔频域无限 ,时域无限↔频域有限

    2.线性:      fi(t)↔Fi(w) ,i=1,2...

                     Fi(t)↔2∏ fi(-t)   

    3.比例性:     f(t)↔F(w) 

                     f(at)↔(1/|a|) F(w/a)     ------时域越宽↔频域越窄 ,时域越窄↔频域越宽

    4.频率搬移特性:(调制概念)

    f(t) eˆ(jw0t) ↔   F(w-w0)                      ------jw0t中有相位j,所以不常使用eˆ(jw0t)作为调制信号

    f(t) cosw0t   ↔  ½ [F(w-w0)+F(w+w0)]   ------将f(t)搬到了以w0为中心(比如搬到高频点)

    5.时移性:(时移了一个信号,幅度谱F(w)没变,相位谱变了一个-w0t

    f(t-t0)↔F(w) eˆ(-jw0t)

    6.微分特性 :(相当于经过了一个RC电路)

    7.积分特性

    8.时域卷积:(输入信号f(t)经过系统信号f2(t)(传输函数H(w)=F2(w))后的输出信号R(t)就是f1f2的卷积)(因为按照时域分析比较复杂,所以转换到频域分析)

    f1(t)*f2(t)↔F1(w) F2(w)

    f1(t) f2(t)↔(1/2∏) [F1(w) * F2(w)]

     

    --------------------------------------------------------------------------------------------------------------------------------------------------------------

    一些证明:(如果有些重要的公式记不牢的话,可以帮助记忆)

    1.  f(t)=1 ↔ F(w)=2∏δ(w)

        证:   f(t)=(1/2∏)-∞ 2∏ δ(w) e^(jwt) dw

    2.  周期性冲激函数:δT(t)=Σ n=-∞∞ δ(t-nT)        

                                  因为单位冲击串δ(t)的(傅里叶级数的系数)   F(w)=(1/T) ∫(-½T)(½T)δ(t) e^(-jnw0t) dt = 1/T

       所以,  δT(t)= (1/T)Σ n=-∞ e^(jnw0t)    ↔FT(w) =  w0 Σ n=-∞  δ(w-nw0)

       所以,周期性冲击串(高为1)的 傅里叶变换F(w)~w 也是 周期性冲击串 (高为w0=2∏/T)!!

    3.周期性矩形脉冲: GT(t)= Σ n=-∞ G(t-nT) 

    因为门函数G(t)(高为A=1)的(傅里叶级数的系数)F(w)=(1/T) ∫(-½T)(½T)G(t) e^(-jnw0t) dt =(ζ/T)Sa(nw0ζ/2)    ζSa(w0ζ/2)

    所以,  GT(t)= (ζ/T)Σ n=-∞ Sa(nw0ζ/2) e^(jnw0t)    ↔ FT(w)=  w0 Σ n=-∞  δ(w-nw0)

    4.图像

    (1)单位冲激函数 的F(w)~w 是 高为1的均匀谱,

     直流信号f(t)=1 的F(w)~w 是 高为2∏的冲激函数,

      即:   单位冲激函数图像 ↔ 直流信号的图像 

               直流信号的图像 ↔ 单位冲激函数图像(高为1)

    (2)门函数 的F(w)~w 是 抽样函数的拉伸,经过点(0,ζ)  (1/ζ,0) (2/ζ,0) ...图像是连续谱

           周期矩形信号的F(w)~w 是 抽样函数的拉伸...F(w)图像是离散谱, 在X=nw0处取值,n=0,+/- 1,+/- 2,...

    ****************************************************************** 

    习题易错点点拨:

    1.求功率信号s(t)的频谱:

    功率信号和它的频谱函数 不是傅里叶变换对!

    S(w)是s(w)展开成傅里叶级数的系数,只能用系数的表达式求得。

    2.指数函数的模:

    cosx+ j sinx =e^jx 

    cosx- j sinx =e^-jx

    所以,|e^jx|=|e^-jx|=1

    3. 

    1/j= -j

     

     

     

     

     

     

     

     

             

            

     

        

     

                                                 

     

     

     

                                        

           

           

     

    转载于:https://www.cnblogs.com/flowerslip/p/5943748.html

    展开全文
  • 实现频谱分析。能显示信号与频谱图。主要是对正弦信号和三角波进行一维FFT变换,得到频谱
  • 图像傅立叶频谱分析 参考:http://cns-alumni.bu.edu/~slehar/fourier/fourier.html#filtering 很棒 分析: 如果输入二维图像数据,则显示的图像是输入的灰度分布,傅立叶频谱是输入的频率分布,频谱图中心对称。 ...

    图像傅立叶频谱分析


    参考:http://cns-alumni.bu.edu/~slehar/fourier/fourier.html#filtering 很棒

    分析:

    如果输入二维图像数据,则显示的图像是输入的灰度分布,傅立叶频谱是输入的频率分布,频谱图中心对称。

    图像频谱即二维频谱图通过对原图像进行水平和竖直两个方向的所有扫描线处一维傅立叶变换的叠加得到

    频谱图中以图中心为圆心,圆的相位对应原图中频率分量的相位,半径对应频率高低,低频半径小,高频半径大,中心为直流分量,某点亮度对应该频率能量高低。

    从测试案例中更清楚的提现以上几点

    以下为几个测试案例:

    1.水平方向为sin函数,竖直方向没有变化,对应频谱如图为零相位相对低频的一个亮点,而其他位置基本为黑色,说明没有其他频率分量(水平方向其他小亮点是由于原图不是严格的sin函数而产生的噪声)

     

    2.相对1频率变高,频谱图中亮点位置半径变大

    3.sin函数方向改变,频谱图的方向也改变,两种解释。可以理解为水平方向和竖直方向单独扫描都是sin函数,对应频谱叠加所得。也可是理解为原图sin函数方向(相位)改变,频谱图相位变化

    4.3图叠加1图

     

    5.频率再次升高,频谱图半径再次增大

    6.1图叠加2图,频谱图也叠加

    7.原图为一条竖直线,每个行扫描需要若干频率(几乎所有频率)正弦曲线去叠加逼近,所以频谱图包含了所有频率,竖直扫描依然没有变化,频谱图只有一条横线。

     

    8.以下两图对比,第一个图变化不明显,对比度低,频谱图中心亮周围暗,主要为低频分量

    第二个图相对对比度高,频谱周围部分比第一张图的频谱要亮的多,第二张图高频分量更多,但原图背景仍然是灰色图,所以频谱图也是中心最亮,低频分量最高。



    代码:


    1.图像的傅里叶频谱的意义

    之前的博文其实已经归纳过这方面的内容了。我们常用的图像平滑处理,其实就是一个低通滤波,一定程度上去除高频信号,可以使得图像变得柔和(也就是平滑)。但是,在去除周期性噪声时候,空间域内的滤波(卷积)就不是那么好操作了。所以,这里时候,无论是理解起来方便,还是其他原因,都需要在频域内进行滤波。 
    详细的叙述还是在下面的博文里面啦!!!! 
    [数字图像处理]频域滤波(1)–基础与低通滤波器 
    [数字图像处理]频域滤波(2)–高通滤波器,带阻滤波器与陷波滤波器

    2. 傅里叶频谱的计算

    这部分的内容,主要就是使用OpenCV自带的函数 
    void cvDFT( const CvArr* src, CvArr* dst, int flags, int nonzero_rows=0 ) 
    去求取图像的傅里叶变换。这里,输出结果CvArr* dst由两个通道组成,分别代表了实部与虚部。我们再根据如下算式,就可以得到傅里叶频谱了。 
    |F(u,v)|=R2(u,v)+F2(u,v)2  
    我自己也参考了很多人的代码,然后实现的代码如下。

    <code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">IplImage* fft2(IplImage* image_input)
    {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftWidth  = getOptimalDFTSize(image_input->width);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftHeight = getOptimalDFTSize(image_input->height);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//cout<< " Width" <<  image_input->width << "    " <<  dftWidth  << "\n";</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//cout<< "Height" << image_input->height << "    " <<  dftHeight << "\n";</span>
    
        IplImage* image_padded = cvCreateImage(cvSize(dftWidth,dftHeight),
                                               IPL_DEPTH_8U,
                                               <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        cvCopyMakeBorder( image_input, image_padded, cvPoint(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>), IPL_BORDER_CONSTANT,cvScalarAll(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)); 
    
        IplImage *image_Re =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> , *image_Im = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, *image_Fourier = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; 
    
        image_Re = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        image_Im = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        image_Fourier = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Re <--- image_padded </span>
        cvConvertScale(image_padded,image_Re);   
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Im <--- 0</span>
        cvZero(image_Im);                 
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[0] <--- image_Re</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[1] <--- image_Im</span>
        cvMerge(image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,image_Fourier); 
    
        cvDFT(image_Fourier,image_Fourier,CV_DXT_FORWARD);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[0] ---> image_Re</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[1] ---> image_Im</span>
        cvSplit(image_Fourier,image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Mag = sqrt(Re^2 + Im^2)</span>
        cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>);
        cvPow(image_Im,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>);
        cvAdd(image_Re,image_Im,image_Re);
        cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// log (1 + Mag)</span>
        cvAddS(image_Re,cvScalar(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>),image_Re ); 
        cvLog (image_Re,image_Re); 
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  |-----|-----|           |-----|-----|   </span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  |  1  |  3  |           |  4  |  2  |</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  |-----|-----|   --->    |-----|-----|</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  |  2  |  4  |           |  3  |  1  |</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//  |-----|-----|           |-----|-----|</span>
    
        IplImage *Fourier = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        cvZero(image_Fourier);
    
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> cx = image_Re->width/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> cy = image_Re->height/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;
    
        cvSetImageROI(image_Re,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1 </span>
        cvSetImageROI( Fourier,cvRect(cx,cy,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 4 </span>
        cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,Fourier,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,Fourier);
    
        cvSetImageROI(image_Re,cvRect(cx,cy,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 4 </span>
        cvSetImageROI( Fourier,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1 </span>
        cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,Fourier,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,Fourier);
    
        cvSetImageROI(image_Re,cvRect(cx, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3 </span>
        cvSetImageROI( Fourier,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cy,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2 </span>
        cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,Fourier,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,Fourier);
    
        cvSetImageROI(image_Re,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cy,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2 </span>
        cvSetImageROI( Fourier,cvRect(cx, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3 </span>
        cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,Fourier,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,Fourier);
    
        cvResetImageROI(image_Re);
        cvResetImageROI( Fourier);
    
        cvNormalize(Fourier,Fourier,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,CV_C,<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>);
    
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(Fourier);
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li></ul>

    从这里开始,还是简单的分析一下代码吧。

    <code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftWidth  = getOptimalDFTSize(image_input->width);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftHeight = getOptimalDFTSize(image_input->height);
    IplImage* image_padded = cvCreateImage(cvSize(dftWidth,dftHeight),
                                           IPL_DEPTH_8U,
                                           <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    cvCopyMakeBorder( image_input, image_padded, cvPoint(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>), IPL_BORDER_CONSTANT,cvScalarAll(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)); </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

    这里参考了文献[2]中的说法,在尺寸数为2,3,5的倍数的场合,计算的速度是最快的。所以使用函数getOptimalDFTSize()来寻找最匹配的尺寸,然后再同伙cvCopyMakeBorder()进行多余部分的填充,这里选的配置是将图放在从点(0,0)开始的位置,其余不足的地方,用0进行填充。

    <code class="hljs haskell has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IplImage</span> *image_Re =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> , *image_Im = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, *image_Fourier = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; 
    
    <span class="hljs-title" style="box-sizing: border-box;">image_Re</span> = cvCreateImage(cvSize(dftWidth,dftHeight),<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IPL_DEPTH_64F</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    <span class="hljs-title" style="box-sizing: border-box;">image_Im</span> = cvCreateImage(cvSize(dftWidth,dftHeight),<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IPL_DEPTH_64F</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    <span class="hljs-title" style="box-sizing: border-box;">image_Fourier</span> = cvCreateImage(cvSize(dftWidth,dftHeight),<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">IPL_DEPTH_64F</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);
    
    //image_Re <-<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">-- image_padded </span>
    <span class="hljs-title" style="box-sizing: border-box;">cvConvertScale</span>(image_padded,image_Re);   
    //image_Im <-<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">-- 0</span>
    <span class="hljs-title" style="box-sizing: border-box;">cvZero</span>(image_Im);                 
    //image_Fourier[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <-<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">-- image_Re</span>
    //image_Fourier[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <-<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">-- image_Im</span>
    <span class="hljs-title" style="box-sizing: border-box;">cvMerge</span>(image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,image_Fourier); 
    
    <span class="hljs-title" style="box-sizing: border-box;">cvDFT</span>(image_Fourier,image_Fourier,<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">CV_DXT_FORWARD</span>);
    
    //image_Fourier[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">---> image_Re</span>
    //image_Fourier[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">---> image_Im</span>
    <span class="hljs-title" style="box-sizing: border-box;">cvSplit</span>(image_Fourier,image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

    其实这里的很好理解的,将填充到最适尺寸的图像赋值给image_Re,将image_Im赋值为0。让后将这两层图复制到image_Fourier的两个通道里,然后使用函数cvDFT()进行傅里叶变换。得到结果还是存在于image_Fourier的两个通道里,分别代表实部与虚部,然后通过cvSplit()将其抽出到image_Re与image_Im里。

    <code class="hljs scss has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Mag = sqrt(Re^2 + Im^2)</span>
    <span class="hljs-function" style="box-sizing: border-box;">cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">cvPow(image_Im,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">cvAdd(image_Re,image_Im,image_Re)</span>;
    <span class="hljs-function" style="box-sizing: border-box;">cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>)</span>;
    
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// log (1 + Mag)</span>
    <span class="hljs-function" style="box-sizing: border-box;">cvAddS(image_Re,<span class="hljs-function" style="box-sizing: border-box;">cvScalar(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)</span>,image_Re )</span>; 
    cvLog (image_Re,image_Re); </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

    以上代码,实现了以下计算。 
    |F(u,v)|=R2(u,v)+F2(u,v)2  
    还有就是进行了一个对数变换,这个也没的说,看傅里叶频谱的标配操作。

    <code class="hljs mathematica has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">//  |-----|-----|           |-----|-----|   
    //  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>  |           |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>  |
    //  |-----|-----|   --->    |-----|-----|
    //  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>  |           |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>  |  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>  |
    //  |-----|-----|           |-----|-----|
    
    IplImage *<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span> = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    cvZero(image_Fourier);
    
    int cx = image_Re->width/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;
    int cy = image_Re->height/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;
    
    cvSetImageROI(image_Re,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> 
    cvSetImageROI( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,cvRect(cx,cy,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> 
    cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);
    
    cvSetImageROI(image_Re,cvRect(cx,cy,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> 
    cvSetImageROI( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> 
    cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);
    
    cvSetImageROI(image_Re,cvRect(cx, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> 
    cvSetImageROI( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cy,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> 
    cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);
    
    cvSetImageROI(image_Re,cvRect( <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cy,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> 
    cvSetImageROI( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,cvRect(cx, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,cx,cy));  // <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> 
    cvAddWeighted(image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);
    
    cvResetImageROI(image_Re);
    cvResetImageROI( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);
    
    cvNormalize(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,CV_C,NULL);
    
    return(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Fourier</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>

    其实重头戏在这里,这里需要一个交换操作。至于为何所求得的傅里叶频谱为什么需要交换的原因是,这个代码求得的结果其实是范围 [0,2π] 内的傅里叶变换。而我们所需要的是 [π,π] 内的结果。详细的原因,还是在我以前的博客里有说明。 
    [数字图像处理]频域滤波(1)–基础与低通滤波器

    这里,我使用了ROI操作与cvAddWeighted()函数进行了实现。其运行的结果如下所示。 
    这里写图片描述
    恩,基本可以看出来,直流分量也被我移动到了中心,以上代码实现了傅里叶频谱的计算与显示。

    3. 不用交换操作的代码

    使用MATLAB去求取尺寸为 M×N 图像 f 的傅里叶频谱时候,通常会用fft2(f,2*M,2*N)。使用此函数求得的福利叶变换,其实还是 [0,2π] 范围内的傅里叶变换。要想使得傅里叶频谱的DC分量位于中心的话,其实还是需要一些别的操作的。冈萨雷斯的《数字图像处理》一书中,对于这个问题,是利用了傅里叶变换的评议特性,即 
    f(x,y)=f(x,y)×(1)x+y  
    然后再对函数 f(x,y) 进行福利叶变换,所得到结果,就是所需要的是 [π,π] 内傅里叶变换的结果。具体的原理与推导,还是参看冈萨雷斯的《数字图像处理》英文原本的p258页左右,中文译本的p148左右。当然,嫌麻烦的话,还可以看我的博文,博文中也简明推导了平移特性。 
    [数字图像处理]频域滤波(1)–基础与低通滤波器 
    为此,实现的代码变为了如下形式。

    <code class="hljs cpp has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">IplImage* fft2_New(IplImage* image_input)
    {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftWidth  = getOptimalDFTSize(image_input->width);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dftHeight = getOptimalDFTSize(image_input->height);
    
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><< <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" Width"</span> <<  image_input->width << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"    "</span> <<  dftWidth  << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\n"</span>;
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><< <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Height"</span> << image_input->height << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"    "</span> <<  dftHeight << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\n"</span>;
    
        IplImage* image_padded = cvCreateImage(cvSize(dftWidth,dftHeight),
                                               IPL_DEPTH_8U,
                                               <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        cvCopyMakeBorder( image_input, image_padded, cvPoint(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>), IPL_BORDER_CONSTANT,cvScalarAll(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)); 
    
        IplImage *image_Re =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> , *image_Im = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, *image_Fourier = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; 
    
        image_Re = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        image_Im = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
        image_Fourier = cvCreateImage(cvSize(dftWidth,dftHeight),IPL_DEPTH_64F,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Re = image_padded .* (-1)^(x+y);  </span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">double</span> pixel;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> y=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;y<image_padded->height;y++)
        {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> x=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;x<image_padded->width;x++)
            {
                pixel = cvGetReal2D(image_padded,x,y);
                pixel = ((x+y)%<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)?(pixel):((-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)*pixel);
                cvSetReal2D(image_Re,x,y,pixel);
            }
        }
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Im <--- 0</span>
        cvZero(image_Im);                 
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[0] <--- image_Re</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[1] <--- image_Im</span>
        cvMerge(image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,image_Fourier); 
    
        cvDFT(image_Fourier,image_Fourier,CV_DXT_FORWARD);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[0] ---> image_Re</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//image_Fourier[1] ---> image_Im</span>
        cvSplit(image_Fourier,image_Re,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Mag = sqrt(Re^2 + Im^2)</span>
        cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>);
        cvPow(image_Im,image_Im,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.0</span>);
        cvAdd(image_Re,image_Im,image_Re);
        cvPow(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>);
    
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// log (1 + Mag)</span>
        cvAddS(image_Re,cvScalar(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>),image_Re ); 
        cvLog (image_Re,image_Re); 
    
        cvNormalize(image_Re,image_Re,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,CV_C,NULL);
    
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>(image_Re);
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li></ul>

    在这里,由于考虑到计算的原因,我将 f(x,y)=f(x,y)×(1)x+y 这个计算,用下面代码去进行了实现。

    <code class="hljs perl has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span><image_padded->height;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span>++)
    {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span>=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span><image_padded->width;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span>++)
        {
            pixel = cvGetReal2D(image_padded,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span>);
            pixel = ((<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span>+<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span>)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">%2</span> == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)?(pixel):((-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*pixel</span>);
            cvSetReal2D(image_Re,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">x</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">y</span>,pixel);
        }
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

    其实也就相当于, x+y 是偶数的话 f(x,y) 不变, x+y 是奇数的话 f(x,y) 变为负。用这样一个简单的判断去实现。其运行的结果,如下所示。

    原图的傅里叶频谱 
    原图的结果
    使用 11×11 高斯滤波器后的傅里叶频谱 
    这里写图片描述

    从实验结果看来,可以看出以下两点

    1. 对于原图而言两个函数的结果基本一致,两个函数都得到了正确的结果。
    2. 使用平滑处理后,频谱的高频成分明显变小,对于空间域的图像而言,图像变得模糊了。


    展开全文
  • 具体步骤 频域和时域对应关系 频谱混叠 频谱泄露 栅栏效应 混叠现象 频谱泄露 栅栏效应 结合matlab对应分析 PDF版本笔记 参考南京信息工程大学的《数字信号处理》,仅作学习总结 ...
  • PassFail功能应用在测试测量领域被广泛使用,无论是在示波器、万用表还是在频谱分析仪上都可以看到它的身影。PassFail功能的本质是将采集到的信号数据与模版数据比较,通过判断信号与模版的比较结果给出Pass或是Fail...
  • 频谱信号PassFail应用

    2020-10-24 16:03:39
    PassFail功能应用在测试测量领域被广泛使用,无论是在示波器、万用表还是在频谱分析仪上都可以看到它的身影。PassFail功能的本质是将采集到的信号数据与模版数据比较,通过判断信号与模版的比较结果给出Pass或是Fail...
  •  PassFail功能应用在测试测量领域被广泛使用,无论是在示波器、万用表还是在频谱分析仪上都可以看到它的身影。PassFail功能的本质是将采集到的信号数据与模版数据比较,通过判断信号与模版的比较结果给出Pass或是...
  • DTMF按键频谱分析

    2021-03-02 10:58:29
    需要软件: wireshark,Adobe Audition 步骤: 语音网关DTMF按键转换成inband 呼入抓包 使用wireshark打开抓包 ...鼠标点中按键频谱 Alt +Z 进行频谱分析 ...对照频谱表波峰判断按键是否标准 ...
  • 只有周期信号在做傅里叶变换时才有频谱能量泄露吗?还是说周期信号和非周期信号都有频谱能量泄露,如果非周期信号有频谱能量泄露如何判断呢?
  • 首先应用层次化的正态分布概率模型来表示压缩频谱的重构,然后各个认知无线电用户交换模型参数并结合本地的压缩采样数据进行压缩频谱重构,最后根据重构的频谱信息判断主用户的忙闲状态从而得到当前认知无线电用户...
  • 通过感知节点共识融合、验证节点共识验证、簇头节点共识确认,在一定置信度下的假设检验判断是否有恶意感知节点发动伪造频谱数据的拜占庭攻击。仿真结果表明分布式共识机制在防御恶意感知节点伪造频谱数据的拜占庭...
  • 图像的傅里叶频谱

    千次阅读 2017-03-25 16:47:59
    1.图像的傅里叶频谱的意义 之前的博文其实已经归纳过这方面的内容了。我们常用的图像平滑处理,其实就是一个低通滤波,一定程度上去除高频信号,可以使得图像变得柔和(也就是平滑)。但是,在去除周期性噪声时候,...
  • 目前,大部分基于能量检测和信号循环平稳的频谱感知算法能够在...最后计算其峰值系数,实现对主用户信号存在性的判断。仿真结果表明,在非平稳噪声环境中,所提出的算法比传统的频谱感知算法识别概率更高,性能更好。
  • GSM信号的测量现代高度发达的通信技术可以让人们在地球的任意地点控制频谱分析仪,因此就更要懂得不同参数设置和不同信号条件对显示结果的影响。典型的全球移动通信系统(GSM)的信号测量如图1所示,它清楚地标明了重要...
  • 该算法基于样本协方差矩阵最大最小特征值之差与几何平均特征值的比值,通过比较该比值与门限的大小来判断主用户是否占用分配频谱,不需要知道主用户信号和噪声的先验信息,得到了十分简单的判决门限表达闭式。...
  • 关于信号的频谱分析

    千次阅读 2020-03-26 13:27:09
    关于信号和图像的频谱分析 频谱分析可以将一种复杂的信号分解为较简单的信号,找出一个信号在不同频率下的信息。频谱是指一个时域的信号在频域下的表示方式,通过对信号进行傅里叶变换得到“幅度频谱”和“相位频谱...
  • 为对子带信号进行正确的频谱检测来判断子带中是否存在信号,继而判断信道数量及位置,提出了2种改进的基于特征值的动态信道化频谱检测算法。根据Wishart随机矩阵的最小特征值具有Tracy-Widom分布的特性,采用最小...
  • 频谱感知是实现认知无线电的重要过程,也是信道分配的前提.认知用户需要在一个较宽的频谱中检测出频谱空洞,然后对这些空洞进行合理分配.首先构建了初始集中式认知网络,中心节点通过协作各认知用户接收的压缩采样信号,...
  • 利用授权用户的状态在相邻感知帧之间变化的概率小这一特性,通过将当前感知帧的能量值与相邻值相结合来判断授权用户状态,这样当授权用户使用授权频段时,所提算法能有效减小采样信号能量值骤减时发生误判的概率。...
  • 什么是频谱泄露

    千次阅读 2016-04-10 18:02:05
    对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱。但是,在利用DFT求它的频谱时,对时域做了截断,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱线出现,它们可以理解为是从...
  • 频谱分析仪是研究信号频谱特征的仪器,在电子技术一日千里的今天,是研究、开发、调试维修中的有力武器。现代频谱分析仪都趋向于智能化,虚拟仪器技术广泛应用,有些就是以专用的计算机系统为核心设计的。其结果是...
  • 频谱相谱功率谱

    2019-01-07 15:46:21
    第一:频谱 一.调用方法 X=FFT(x); X=FFT(x,N); x=IFFT(X); x=IFFT(X,N) 用MATLAB进行谱分析时注意: (1)函数FFT返回值的数据结构具有对称性。 例: N=8; n=0:N-1; xn=[4 3 2 6 7 8 9 0]; Xk=fft(xn) → Xk = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,472
精华内容 2,588
关键字:

判断频谱