【DSP筆記 · 第3章】數字世界的“棱鏡”:離散傅里葉變換(DFT)完全解析

數字世界的“棱鏡”:離散傅里葉變換(DFT)完全解析

在上一章,我們探索了Z變換和離散時間傅里葉變換(DTFT)。我們知道,DTFT是一個無比強大的理論工具,它能將一個時域離散序列的“基因圖譜”——也就是它的頻譜——完整地揭示出來。理論上,只要我們知道了信號的DTFT,就知道了它包含的所有頻率成分。

但這里有一個巨大的“但是”。DTFT是理論上的完美,卻在實踐中遇到了一個無法逾越的鴻溝:

  1. DTFT的定義是針對無限長序列的。而在現實世界中,我們用計算機處理的信號,無論是音頻、圖像還是一段傳感器數據,都必然是有限長度的。
  2. DTFT計算出的頻譜 X ( e j ω ) X(e^{j\omega}) X(e) 是一個關于頻率 ω \omega ω連續函數。計算機天生只能處理離散的數據點,它無法存儲和計算一個連續函數。

這就好比我們擁有一張描繪了整個地球的、精度無限的完美地圖(DTFT),但我們的工具只是一臺內存有限的普通電腦。我們不可能把整張地圖裝進電腦。我們該怎么辦?

答案是:對地圖進行采樣!我們只在有限的區域內(信號的有限長度),選取有限個有代表性的地點(頻譜的有限個點)來觀察。這個為計算機量身定做的、從理論走向實踐的“采樣版”傅里葉變換,就是我們今天的主角——離散傅里葉變換(Discrete Fourier Transform, DFT)

DFT是數字信號處理領域應用最廣泛的工具,沒有之一。從你的手機音樂播放器里的頻譜顯示,到通信系統中的調制解調,再到各種高效的濾波算法,背后都有DFT的身影。理解它,是你從理論學習邁向工程實踐的決定性一步。

從理想到現實:DFT的誕生

讓我們再次明確一下從完美的DTFT到實用的DFT,我們必須解決的兩個核心問題:

  1. 信號長度問題:我們無法處理無限長的信號 x ( n ) x(n) x(n)解決方案:我們只截取信號中一段有限的長度,比如 N N N 個點,來進行分析。
  2. 頻譜連續問題:我們無法計算連續的頻譜 X ( e j ω ) X(e^{j\omega}) X(e)解決方案:我們只在頻譜的一個周期(通常是 [ 0 , 2 π ) [0, 2\pi) [0,2π))內,等間隔地計算 N N N 個點的頻譜值。

這兩個解決方案合在一起,就構成了DFT的本質。

DFT的核心定義

對于一個長度為 N N N 的有限長序列 x ( n ) x(n) x(n)(其中 n = 0 , 1 , … , N ? 1 n=0, 1, \dots, N-1 n=0,1,,N?1),它的N點DFT定義為:
X ( k ) = ∑ n = 0 N ? 1 x ( n ) W N k n , k = 0 , 1 , … , N ? 1 X(k) = \sum_{n=0}^{N-1} x(n) W_N^{kn}, \quad k=0, 1, \dots, N-1 X(k)=n=0N?1?x(n)WNkn?,k=0,1,,N?1
相應地,從頻域序列 X ( k ) X(k) X(k) 恢復時域序列 x ( n ) x(n) x(n) 的逆變換(IDFT)為:
x ( n ) = 1 N ∑ k = 0 N ? 1 X ( k ) W N ? k n , n = 0 , 1 , … , N ? 1 x(n) = \frac{1}{N} \sum_{k=0}^{N-1} X(k) W_N^{-kn}, \quad n=0, 1, \dots, N-1 x(n)=N1?k=0N?1?X(k)WN?kn?,n=0,1,,N?1
這里的 W N W_N WN? 是一個非常重要的符號,它被稱為旋轉因子(Twiddle Factor),其定義為:
W N = e ? j 2 π N W_N = e^{-j\frac{2\pi}{N}} WN?=e?jN2π?
W N k W_N^k WNk? 代表了在復平面單位圓上,從(1, 0)點開始,按順時針方向轉過 k k k 2 π / N 2\pi/N 2π/N 角度后到達的點。整個DFT的計算,本質上就是將時域信號 x ( n ) x(n) x(n) 與這些在單位圓上旋轉的點進行內積運算,從而衡量出信號在各個特定頻率上的分量大小。

DFT與Z變換/DTFT的血緣關系

DFT并不是一個憑空冒出來的全新概念,它與我們在上一章學習的Z變換和DTFT有著深刻的血緣關系。

一個有限長序列 x ( n ) x(n) x(n) 的Z變換為:
X ( z ) = ∑ n = 0 N ? 1 x ( n ) z ? n X(z) = \sum_{n=0}^{N-1} x(n) z^{-n} X(z)=n=0N?1?x(n)z?n
它的DTFT則是Z變換在單位圓上的取值:
X ( e j ω ) = X ( z ) ∣ z = e j ω = ∑ n = 0 N ? 1 x ( n ) e ? j ω n X(e^{j\omega}) = X(z)|_{z=e^{j\omega}} = \sum_{n=0}^{N-1} x(n) e^{-j\omega n} X(e)=X(z)z=e?=n=0N?1?x(n)e?jωn
現在,讓我們在DTFT的頻譜上,等間隔地采樣N個點。采樣點的頻率為 ω k = 2 π k N \omega_k = \frac{2\pi k}{N} ωk?=N2πk?,其中 k = 0 , 1 , … , N ? 1 k=0, 1, \dots, N-1 k=0,1,,N?1。將這個 ω k \omega_k ωk? 代入DTFT的公式:
X ( e j ω k ) = ∑ n = 0 N ? 1 x ( n ) e ? j ( 2 π k N ) n = ∑ n = 0 N ? 1 x ( n ) ( e ? j 2 π N ) k n = ∑ n = 0 N ? 1 x ( n ) W N k n X(e^{j\omega_k}) = \sum_{n=0}^{N-1} x(n) e^{-j (\frac{2\pi k}{N}) n} = \sum_{n=0}^{N-1} x(n) (e^{-j\frac{2\pi}{N}})^{kn} = \sum_{n=0}^{N-1} x(n) W_N^{kn} X(ejωk?)=n=0N?1?x(n)e?j(N2πk?)n=n=0N?1?x(n)(e?jN2π?)kn=n=0N?1?x(n)WNkn?
看!這個結果不就是我們定義的DFT X ( k ) X(k) X(k) 嗎?

所以,我們得出了一個至關重要的結論:
一個N點有限長序列的N點DFT,就是其DTFT(或Z變換)在單位圓上的N個等間隔采樣點。

在這里插入圖片描述

(上圖展示了Z平面上的單位圓,DFT的計算就相當于在這個單位圓上等間隔地取N個點,并計算Z變換在這些點上的值。)

這個結論完美地將理論(DTFT/Z變換)與實踐(DFT)聯系在了一起。DFT通過在頻域進行采樣,成功地將一個連續的頻譜問題轉化為了一個計算機可以處理的離散問題。

DFT的“怪癖”:循環的魔咒

將無限和連續的世界強行壓縮到有限和離散的世界,必然會帶來一些“副作用”。DFT最核心、最獨特,也最容易讓初學者困惑的特性,就是它的隱含周期性(Implied Periodicity)

當你對一個長度為N的序列 x ( n ) x(n) x(n) 進行N點DFT時,DFT算法“看待”這個序列的方式,并不是一個孤立的、長度為N的片段。它會固執地認為,你給它的這個 x ( n ) x(n) x(n),其實是一個周期為N的無限長周期序列中的一個主值周期。

(上隱含周期性:一個有限長序列被DFT看作是首尾相連的圓形序列,并進行周期延拓。)

這個“自作多情”的假設,給DFT的性質帶來了深刻的影響,其中最關鍵的就是循環移位循環卷積

線性卷積 vs. 循環卷積:一個不小心就踩的“坑”

在上一章我們知道,LTI系統中信號的傳遞是通過線性卷積完成的,并且在頻域上有一個優美的性質:時域的線性卷積對應頻域的乘積。
x ( n ) ? h ( n ) ? X ( e j ω ) H ( e j ω ) x(n) \ast h(n) \longleftrightarrow X(e^{j\omega}) H(e^{j\omega}) x(n)?h(n)?X(e)H(e)

我們自然希望DFT也能保持這個美好的性質。但由于隱含周期性的存在,事情發生了變化。在DFT的世界里,時域的運算不再是線性的,而是循環的。

線性卷積的公式是:
y L ( n ) = ∑ k = ? ∞ ∞ x ( k ) h ( n ? k ) y_L(n) = \sum_{k=-\infty}^{\infty} x(k) h(n-k) yL?(n)=k=??x(k)h(n?k)
N點循環卷積的公式是:
y C ( n ) = x ( n ) ? h ( n ) = ∑ m = 0 N ? 1 x ( m ) h ( ( n ? m ) N ) y_C(n) = x(n) \otimes h(n) = \sum_{m=0}^{N-1} x(m) h((n-m)_N) yC?(n)=x(n)?h(n)=m=0N?1?x(m)h((n?m)N?)
注意那個 ( ( n ? m ) N ) ((n-m)_N) ((n?m)N?),它表示對 n ? m n-m n?m 的結果進行模N運算(即取余數)。這就像在一個有N個刻度的時鐘上做減法。例如,在8點循環卷積中,從第1個位置后退3個位置,不是到了-2,而是到了第6個位置( ( 1 ? 3 ) 8 = ? 2 ( m o d 8 ) = 6 (1-3)_8 = -2 \pmod 8 = 6 (1?3)8?=?2(mod8)=6 )。

DFT的卷積定理說的是:
N點循環卷積對應N點DFT的乘積。
x ( n ) ? h ( n ) ? X ( k ) H ( k ) x(n) \otimes h(n) \longleftrightarrow X(k) H(k) x(n)?h(n)?X(k)H(k)
這帶來了一個巨大的問題。我們通常想計算的是線性卷積,但如果我們直接計算兩個序列的DFT,在頻域相乘,再做IDFT,我們得到的將是循環卷積的結果。如果兩個序列的長度不合適,循環卷積的結果會因為“周期性”的重疊(稱為時間混疊)而變得面目全非,根本不是我們想要的線性卷積。

那么,我們還能用DFT來幫助我們計算線性卷積嗎?
答案是肯定的,只要我們使用一個絕妙的技巧——補零(Zero-Padding)

假設我們有兩個序列, x ( n ) x(n) x(n) 長度為 M M M h ( n ) h(n) h(n) 長度為 P P P。我們知道,它們的線性卷積結果 y L ( n ) y_L(n) yL?(n) 的長度將是 L = M + P ? 1 L = M+P-1 L=M+P?1

快速線性卷積的正確步驟

  1. 確定長度: 計算出線性卷積結果的長度 L = M + P ? 1 L = M+P-1 L=M+P?1
  2. 補零: 將序列 x ( n ) x(n) x(n) h ( n ) h(n) h(n) 的尾部都補上若干個零,使它們的長度都達到 至少為L 的新長度 N N N(為了后續FFT算法的效率,通常會選擇一個大于等于L的2的冪次方作為N)。
  3. DFT: 對補零后的兩個序列做N點DFT,得到 X ( k ) X(k) X(k) H ( k ) H(k) H(k)
  4. 頻域相乘: 計算 Y ( k ) = X ( k ) ? H ( k ) Y(k) = X(k) \cdot H(k) Y(k)=X(k)?H(k)
  5. IDFT: 對 Y ( k ) Y(k) Y(k) 做N點IDFT,得到最終的結果 y ( n ) y(n) y(n)

通過補零,我們相當于把循環卷積的“時鐘”刻度 N 拉得足夠長,使得在一個周期內,翻轉后的 h ( n ) h(n) h(n) x ( n ) x(n) x(n) 進行卷積時,其“尾部”不會“從時鐘的另一頭繞回來”污染到“頭部”。這樣,在一個周期內計算出的循環卷積結果,就和線性卷積的結果完全一樣了。

這個利用DFT(及其快速算法FFT)來計算線性卷積的方法,被稱為快速卷積,是數字信號處理中最高效的卷積計算方法。

DFT的威力:從頻譜分析到快速計算

掌握了DFT的定義和核心特性后,我們來看看它在實際工程中的兩大應用。

應用一:數字頻譜分析

DFT最直接的應用,就是作為一種頻譜分析儀。只要我們將一段信號(比如一段錄音)送入計算機,對其進行DFT,得到的 X ( k ) X(k) X(k) 的幅度 ∣ X ( k ) ∣ |X(k)| X(k) 就告訴了我們,這段信號在各個離散頻率點 f k = k ? f s / N f_k = k \cdot f_s / N fk?=k?fs?/N 上的能量強度。這就像一個棱鏡,將混合在一起的白光(時域信號)分解成赤橙黃綠青藍紫的彩色光譜(頻域信號)。

然而,我們必須清醒地認識到,這個“數字棱鏡”并非完美,它會帶來一些由“有限”觀測所導致的必然誤差:

  • 頻譜泄漏(Spectral Leakage): 我們對信號的觀測是有限的,這相當于給無限長的原始信號乘上了一個矩形“窗戶”。這個操作在頻域上會引起卷積,使得原本單一頻率的尖銳譜線,“泄漏”成一個主瓣和多個旁瓣。這會導致我們探測到一些本不存在的頻率分量,并可能掩蓋掉一些微弱的真實信號。選擇不同的窗函數(如漢寧窗、哈明窗)可以在主瓣寬度和旁瓣抑制之間進行權衡,以減小泄漏。

請添加圖片描述

(上圖展示了頻譜泄漏效應。一個理想單頻正弦波的頻譜(左)應該是一個尖峰,但由于加窗截斷,其實際DFT頻譜(右)變成了一個有主瓣和多個旁-瓣的形狀。)

  • 柵欄效應(Picket-Fence Effect): DFT只在N個離散的頻率點上對真實頻譜進行采樣。如果一個信號的真實頻率峰值恰好落在了兩個采樣點之間,那么我們在兩個采樣點上觀測到的幅度都將低于真實峰值。這就像我們透過一個柵欄看風景,我們只能看到柵欄縫隙里的景象,可能會錯過最精彩的部分。增加DFT的點數N(通過補零)可以加密“柵欄”的縫隙,更精確地找到峰值位置和大小。

應用二:快速卷積的基石

如前文所述,利用DFT進行快速卷積是其另一大核心應用。直接計算M點和P點序列的線性卷積,其計算復雜度大約是 O ( M ? P ) O(M \cdot P) O(M?P)。而利用DFT(特別是下一章要講的FFT算法)進行快速卷積,其計算復雜度大約是 O ( N log ? N ) O(N \log N) O(NlogN),其中 N N N 是補零后的長度。當序列很長時,FFT方法的效率優勢是壓倒性的。

想象一下,在圖像處理中,一個512x512的模糊核要對一張1920x1080的圖像進行卷積濾波,如果用直接法計算,那將是天文數字。而利用2D-FFT進行快速卷積,則可以在幾秒鐘內完成。這背后全都是DFT的功勞。

DFT的出現,為我們打開了在頻域對信號進行處理的大門,也為下一章的快速傅里葉變換(FFT)——這個被譽為20世紀最重要的算法之一——鋪平了道路。FFT并不是一種新的變換,它只是實現DFT的一種極其高效的算法。沒有DFT的理論基礎,FFT就無從談起。

總結:掌握DFT,掌握實踐

今天,我們踏上了一段從理想到現實的旅程。我們理解到:

  1. DFT是為計算機而生的傅里葉變換。它通過對信號時域和頻域的同時“離散化”,解決了DTFT無法在計算機上實現的問題。
  2. DFT是DTFT的采樣。N點DFT的本質是在單位圓上對序列的Z變換(或DTFT)進行N點等間隔采樣。
  3. DFT的核心“怪癖”是隱含周期性。這導致了時域運算的“循環”特性,最典型的就是循環卷積。
  4. 補零是關鍵技巧。通過對序列進行恰當的補零,我們可以利用DFT的循環卷積定理來高效地計算線性卷積,這就是快速卷積的原理。
  5. DFT是強大的分析工具。作為數字頻譜分析儀,它能揭示信號的頻率構成,但我們也需警惕頻譜泄漏和柵欄效應等實踐中的問題。

DFT是連接理論與工程的堅固橋梁。掌握了它,你就不再僅僅是看著數學公式,而是真正擁有了用計算機分析和處理信號的利器。在下一章,我們將為這把利器裝上一個強力馬達——FFT算法,讓它的威力發揮到極致。


習題

第1題 (概念題)

一位工程師說:“我用計算機直接計算了一個信號的DTFT頻譜,發現它是一個連續的平滑曲線。” 這句話在嚴格意義上正確嗎?為什么?

第2題 (計算題)

有兩個長度為4的序列, x ( n ) = { 1 , 2 , 2 , 1 } x(n)=\{1, 2, 2, 1\} x(n)={1,2,2,1} h ( n ) = { 1 , ? 1 , 0 , 0 } h(n)=\{1, -1, 0, 0\} h(n)={1,?1,0,0}。請計算它們的4點循環卷積 y C ( n ) = x ( n ) ? h ( n ) y_C(n) = x(n) \otimes h(n) yC?(n)=x(n)?h(n)

第3題 (應用題)

你希望使用DFT(以及未來的FFT)來計算兩個有限長序列的線性卷積。第一個序列 x 1 ( n ) x_1(n) x1?(n) 的長度為30個點,第二個序列 x 2 ( n ) x_2(n) x2?(n) 的長度為20個點。為了得到正確的結果,你需要對這兩個序列進行補零,然后進行DFT。請問,你選擇的DFT點數N最小應該是多少?


答案

第1題答案:

這句話在嚴格意義上不正確

原因: 計算機無法直接計算或存儲一個真正的連續函數。DTFT的頻譜 X ( e j ω ) X(e^{j\omega}) X(e) 是一個關于連續變量 ω \omega ω 的函數。這位工程師看到的“連續平滑曲線”實際上是計算了大量點的DFT(例如,對原信號大量補零后做DFT),然后在繪圖時將這些密集的離散點用直線連接起來,從而在視覺上產生了連續的效果。其本質仍然是離散點,而不是真正的連續函數。

第2題答案:

我們可以使用定義法計算。循環卷積 y C ( n ) = ∑ m = 0 3 x ( m ) h ( ( n ? m ) 4 ) y_C(n) = \sum_{m=0}^{3} x(m) h((n-m)_4) yC?(n)=m=03?x(m)h((n?m)4?)

  • y C ( 0 ) = x ( 0 ) h ( 0 ) + x ( 1 ) h ( ? 1 ) 4 + x ( 2 ) h ( ? 2 ) 4 + x ( 3 ) h ( ? 3 ) 4 y_C(0) = x(0)h(0) + x(1)h(-1)_4 + x(2)h(-2)_4 + x(3)h(-3)_4 yC?(0)=x(0)h(0)+x(1)h(?1)4?+x(2)h(?2)4?+x(3)h(?3)4?
    = x ( 0 ) h ( 0 ) + x ( 1 ) h ( 3 ) + x ( 2 ) h ( 2 ) + x ( 3 ) h ( 1 ) = x(0)h(0) + x(1)h(3) + x(2)h(2) + x(3)h(1) =x(0)h(0)+x(1)h(3)+x(2)h(2)+x(3)h(1)
    = ( 1 ) ( 1 ) + ( 2 ) ( 0 ) + ( 2 ) ( 0 ) + ( 1 ) ( ? 1 ) = 1 ? 1 = 0 = (1)(1) + (2)(0) + (2)(0) + (1)(-1) = 1 - 1 = \mathbf{0} =(1)(1)+(2)(0)+(2)(0)+(1)(?1)=1?1=0

  • y C ( 1 ) = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) + x ( 2 ) h ( ? 1 ) 4 + x ( 3 ) h ( ? 2 ) 4 y_C(1) = x(0)h(1) + x(1)h(0) + x(2)h(-1)_4 + x(3)h(-2)_4 yC?(1)=x(0)h(1)+x(1)h(0)+x(2)h(?1)4?+x(3)h(?2)4?
    = x ( 0 ) h ( 1 ) + x ( 1 ) h ( 0 ) + x ( 2 ) h ( 3 ) + x ( 3 ) h ( 2 ) = x(0)h(1) + x(1)h(0) + x(2)h(3) + x(3)h(2) =x(0)h(1)+x(1)h(0)+x(2)h(3)+x(3)h(2)
    = ( 1 ) ( ? 1 ) + ( 2 ) ( 1 ) + ( 2 ) ( 0 ) + ( 1 ) ( 0 ) = ? 1 + 2 = 1 = (1)(-1) + (2)(1) + (2)(0) + (1)(0) = -1 + 2 = \mathbf{1} =(1)(?1)+(2)(1)+(2)(0)+(1)(0)=?1+2=1

  • y C ( 2 ) = x ( 0 ) h ( 2 ) + x ( 1 ) h ( 1 ) + x ( 2 ) h ( 0 ) + x ( 3 ) h ( ? 1 ) 4 y_C(2) = x(0)h(2) + x(1)h(1) + x(2)h(0) + x(3)h(-1)_4 yC?(2)=x(0)h(2)+x(1)h(1)+x(2)h(0)+x(3)h(?1)4?
    = x ( 0 ) h ( 2 ) + x ( 1 ) h ( 1 ) + x ( 2 ) h ( 0 ) + x ( 3 ) h ( 3 ) = x(0)h(2) + x(1)h(1) + x(2)h(0) + x(3)h(3) =x(0)h(2)+x(1)h(1)+x(2)h(0)+x(3)h(3)
    = ( 1 ) ( 0 ) + ( 2 ) ( ? 1 ) + ( 2 ) ( 1 ) + ( 1 ) ( 0 ) = ? 2 + 2 = 0 = (1)(0) + (2)(-1) + (2)(1) + (1)(0) = -2 + 2 = \mathbf{0} =(1)(0)+(2)(?1)+(2)(1)+(1)(0)=?2+2=0

  • y C ( 3 ) = x ( 0 ) h ( 3 ) + x ( 1 ) h ( 2 ) + x ( 2 ) h ( 1 ) + x ( 3 ) h ( 0 ) y_C(3) = x(0)h(3) + x(1)h(2) + x(2)h(1) + x(3)h(0) yC?(3)=x(0)h(3)+x(1)h(2)+x(2)h(1)+x(3)h(0)
    = ( 1 ) ( 0 ) + ( 2 ) ( 0 ) + ( 2 ) ( ? 1 ) + ( 1 ) ( 1 ) = ? 2 + 1 = ? 1 = (1)(0) + (2)(0) + (2)(-1) + (1)(1) = -2 + 1 = \mathbf{-1} =(1)(0)+(2)(0)+(2)(?1)+(1)(1)=?2+1=?1

所以,4點循環卷積的結果是 y C ( n ) = { 0 , 1 , 0 , ? 1 } y_C(n) = \{0, 1, 0, -1\} yC?(n)={0,1,0,?1}

第3題答案:

線性卷積結果的長度為 L = M + P ? 1 L = M + P - 1 L=M+P?1
在這里, M = 30 M = 30 M=30, P = 20 P = 20 P=20
所以,線性卷積結果的長度 L = 30 + 20 ? 1 = 49 L = 30 + 20 - 1 = 49 L=30+20?1=49

為了使用DFT/FFT計算線性卷積而不產生時間混疊,補零后的長度(即DFT的點數N)必須大于或等于線性卷積結果的長度L。
所以,DFT點數N的最小值是 49

(在實際應用中,為了利用FFT算法的高效性,通常會選擇大于等于49的第一個2的冪次方,即 N = 64 N=64 N=64。)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84786.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84786.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84786.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

卷積神經網絡的參數量及尺度變化計算

文章目錄 前言1.卷積2.參數量的計算2.1案例一2.2案例二 3.奇怪的優化思想3.1使用小核卷積替換大核卷積3.2卷積核11的應用 4.輸出圖像尺寸的計算4.1Same convolution4.2具體計算規則4.3轉置卷積 小結 前言 本篇博客主要介紹卷積基本概念,卷積神經網絡的參數量計算、…

OpenCV——圖像平滑

圖像平滑 一、圖像的噪聲1.1、噪聲來源1.2、噪聲類型1.3、噪聲模擬 二、濾波器三、線性濾波3.1、均值濾波3.2、方框濾波3.3、高斯濾波 四、非線性濾波4.1、中值濾波4.2、雙邊濾波 圖像在采集和傳輸過程中容易受到各種因素的影響而產生噪聲,而噪聲會對圖像的正確解讀…

鴻蒙系統備份恢復

鴻蒙系統嘗試者,在純血鴻蒙與鴻蒙4.2/4.3之前反復橫跳,中間折騰… 目錄 鴻蒙4.2/4.3升級鴻蒙5.0系統備份 鴻蒙5.0回退鴻蒙4.2/4.3系統備份備份恢復 華為手機助手注意 鴻蒙4.2/4.3升級鴻蒙5.0 系統備份 云空間備份手機本地備份華為手機助手備份 鴻蒙5.…

JS進階 Day03

1.兩種面向編程思想 2.構造函數實現封裝以及存在的問題 下面就引出了原型對象 3.原型對象prototype 共享原理圖&#xff1a; 4.數組擴展案例-求最大值和數組求和 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

visual studio小番茄插件某些快捷鍵失效

問題 AltO 切換頭文件和源文件失效。 背景 最近升級了 visual studio&#xff0c;多了一些插件 原因 Alt O 快捷鍵被其他插件占用了 解決方案 工具 → 選項 → 環境 → 鍵盤 搜索這個 VAssistX.OpenCorrespondingFile&#xff08;切換頭/源文件&#xff09; 發現命令的快…

基于單片機的PT100溫度變送器設計

基于單片機的PT100溫度變送器設計 文章目錄 基于單片機的PT100溫度變送器設計前言一、資源分享二、系統框架三、硬件準備1.主控制器2、PT100溫度傳感器3、顯示屏4、WIFI模塊5、USB轉RS485模塊6、SP3485EN7、K11-11D3 四、設計PCB1、安裝下載立創EDA專業版2、畫原理圖3、擺放元器…

Git 清理指南:如何從版本庫中移除誤提交的文件(保留本地文件)

場景 在 Git 項目中&#xff0c;我們可能會不小心提交了本應忽略的文件&#xff08;如 node_modules/、.env、*.log 等&#xff09;&#xff0c;導致倉庫體積膨脹或敏感信息泄露。本文介紹如何從 Git 歷史中徹底刪除這些文件&#xff0c;同時保留本地文件。 解決方案 1. 確認…

服務器數據恢復—重裝系統導致XFS文件系統分區無法訪問的數據恢復案例

服務器數據恢復環境&故障&#xff1a; 一臺服務器上通過磁盤柜RAID卡組建的riad5磁盤陣列&#xff0c;服務器上層安裝Linux操作系統&#xff0c;搭建XFS文件系統。服務器上層分配一個LUN&#xff0c;并劃分了兩個分區。通過LVM擴容的方式將sdc1分區加入到了root_lv中&#…

在QtCreator中使用GitHubCopilot

文章目錄 1.github copilot賬號2. 安裝node.js3.安裝 GitHub Copilot Neovim plugin4.在Qt中啟用4.1.在extension中啟用4.2.在配置中啟用4.3.使用/禁用 5.評價 在最新版的QtCreator中&#xff0c;已經通過Extension集成了GitHubCopilot進來。 我用的是16.0.2版本的&#xff08;…

島嶼周長問題的三種解法:直接計數法、數學計算法與深度優先搜索

問題描述 給定一個二維網格 grid&#xff0c;其中1表示陸地&#xff0c;0表示水域。網格中的格子水平和垂直方向相連&#xff08;對角線不相連&#xff09;。網格中恰好有一個島嶼&#xff08;即一個或多個相連的陸地格子&#xff09;&#xff0c;需要計算這個島嶼的周長。 解…

將包含父子關系的扁平列表 List<Demo> 轉換成樹形結構的 List<DemoVO>,每個節點包含自己的子節點列表

1.stream遞歸操作 private List<DemoVO> createtree(List<Demo> datas) {//得到父節點return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo new DemoVO();vo.setTaxonomyId(m.getPlatformTaxo…

【Jmeter】Jmeter 高并發性能壓力測試

目錄 一、下載 Jmeter 二、配置環境變量 三、設置中文語言 四、入門最簡單的高并發性能壓測流程 1. 添加線程組 2. 添加請求 3. 添加監聽器 3.1 添加聚合報告 3.2 添加結果樹 4. 啟動測試 2 種啟動方式&#xff1a; 查看結果樹&#xff1a; 聚合報告&#xff1a; 五…

芯片測試之VIL/VIH(輸入電平)Test全解析:從原理到實戰

大家好&#xff0c;我是硅言。在數字芯片的“溝通體系”中&#xff0c;??VIL&#xff08;輸入低電平&#xff09;??和??VIH&#xff08;輸入高電平&#xff09;??如同芯片的“聽覺閾值”&#xff0c;決定了它能否準確識別外部信號的邏輯狀態。本文將從原理剖析、測試方…

【WPF】MVVM的消息機制

在WVM&#xff08;Model-View-ViewModel&#xff09;架構中&#xff0c;消息機制主要用于實現ViewModel與View之間的通信&#xff0c;同時保持它們的分離。這對于維護代碼的清晰度和可測試性非常重要。在WPF&#xff08;Windows Presentation Foundation&#xff09;應用程序中…

以樓宇自控關鍵技術,夯實現代低碳建筑發展重要基礎

當“碳達峰、碳中和”成為全球發展共識&#xff0c;建筑行業作為能源消耗與碳排放的重要領域&#xff0c;正加速向低碳化轉型。在這場綠色變革中&#xff0c;樓宇自控技術憑借對建筑設備的智能管控與能源優化能力&#xff0c;成為現代低碳建筑建設的核心支撐。從數據采集到智能…

西電【信息與內容安全】課程期末復習筆記

西電【信息與內容安全】課程期末復習筆記 來自2022年春的古早遺留檔案&#xff0c;有人需要這個&#xff0c;我就再發一下吧。 ? 平時成績&#xff1a; 10%。線上&#xff1a; 10% &#xff08;線上學習內容&#xff0c; 共 100 分。&#xff09;實驗&#xff1a; 10% &#…

【論文閱讀筆記】ICLR 2025 | 解析Ref-Gaussian如何實現高質量可交互反射渲染

Reflective Gaussian Splatting Info 會議 【ICLR 2025】 作者 復旦大學&#xff0c;薩里大學&#xff1b;復旦張力教授團隊 Github地址 https://github.com/fudan-zvg/ref-gaussian.git Project地址 https://fudan-zvg.github.io/ref-gaussian/ Abstract 新視圖合成得益…

面向GPU、CPU及機器學習加速器的機器學習編譯器

機器學習編譯器概述 機器學習編譯器是一種專門針對機器學習工作負載設計的工具&#xff0c;旨在將高層模型描述&#xff08;如TensorFlow或PyTorch模型&#xff09;高效編譯為可在不同硬件&#xff08;如GPU、CPU或專用加速器&#xff09;上執行的底層代碼。其核心目標是優化計…

論文分類打榜賽Baseline(2):InternLM昇騰硬件微調實踐

本文來自社區投稿&#xff0c;作者丁一超 書生大模型實戰營第5期已正式啟動&#xff0c;本期實戰營新增「論文分類打榜賽」&#xff0c;以幫助學員更好地掌握大模型技能。 本文將手把手帶領大家如何基于昇騰微調 InternLM 模型&#xff0c;輕松上手論文自動分類任務。從環境配…

mac安裝mvnd結合idea

mac安裝mvnd結合idea hi&#xff0c;我是阿昌&#xff0c;今天記錄一下mac系統下如何安裝mvnd同時通過maven-helper插件配置mvnd命令&#xff0c;提升編譯速度&#xff1b; 0、前言 如果你正在開發一個由大量模塊組成的大型項目&#xff0c;Gradle可以讓大型項目構建的更快&…