Skip to content

Commit 504041d

Browse files
committed
feat(Analysis/Fourier): Plancherel's theorem (#29860)
The Plancherel theorem states that the Fourier transform is unitary on L^2. We prove the main step which is that the Fourier transform on Schwartz space preserves the L^2-norm.
1 parent 5aecb23 commit 504041d

File tree

6 files changed

+165
-28
lines changed

6 files changed

+165
-28
lines changed

Mathlib/Analysis/Complex/Basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,9 @@ theorem conjCLE_apply (z : ℂ) : conjCLE z = conj z :=
245245
def ofRealLI : ℝ →ₗᵢ[ℝ] ℂ :=
246246
⟨ofRealAm.toLinearMap, norm_real⟩
247247

248+
@[simp]
249+
theorem ofRealLI_apply (x : ℝ) : ofRealLI x = x := rfl
250+
248251
theorem isometry_ofReal : Isometry ((↑) : ℝ → ℂ) :=
249252
ofRealLI.isometry
250253

Mathlib/Analysis/Distribution/FourierSchwartz.lean

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ functions, in `fourierTransformCLM`. It is also given as a continuous linear equ
1616
-/
1717

1818
open Real MeasureTheory MeasureTheory.Measure
19-
open scoped FourierTransform
19+
open scoped FourierTransform ComplexInnerProductSpace
2020

2121
namespace SchwartzMap
2222

2323
variable
2424
(𝕜 : Type*) [RCLike 𝕜]
25+
{W : Type*} [NormedAddCommGroup W] [NormedSpace ℂ W] [NormedSpace 𝕜 W]
2526
{E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E] [NormedSpace 𝕜 E] [SMulCommClass ℂ 𝕜 E]
27+
{F : Type*} [NormedAddCommGroup F] [NormedSpace ℂ F] [NormedSpace 𝕜 F] [SMulCommClass ℂ 𝕜 F]
2628
{V : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [FiniteDimensional ℝ V]
2729
[MeasurableSpace V] [BorelSpace V]
2830

@@ -80,6 +82,68 @@ noncomputable def fourierTransformCLM : 𝓢(V, E) →L[𝕜] 𝓢(V, E) := by
8082

8183
variable [CompleteSpace E]
8284

85+
@[simp]
86+
theorem fourier_inversion (f : 𝓢(V, E)) (x : V) : 𝓕⁻ (𝓕 f) x = f x :=
87+
Integrable.fourier_inversion f.integrable (fourierTransformCLM ℂ f).integrable
88+
f.continuous.continuousAt
89+
90+
@[simp]
91+
theorem fourier_inversion_inv (f : 𝓢(V, E)) (x : V) : 𝓕 (𝓕⁻ f) x = f x :=
92+
Integrable.fourier_inversion_inv f.integrable (fourierTransformCLM ℂ f).integrable
93+
f.continuous.continuousAt
94+
95+
variable
96+
{F : Type*} [NormedAddCommGroup F] [NormedSpace ℂ F] [NormedSpace 𝕜 F] [SMulCommClass ℂ 𝕜 F]
97+
{G : Type*} [NormedAddCommGroup G] [NormedSpace ℂ G]
98+
99+
variable [CompleteSpace F]
100+
101+
/-- The Fourier transform satisfies `∫ 𝓕 f * g = ∫ f * 𝓕 g`, i.e., it is self-adjoint.
102+
Version where the multiplication is replaced by a general bilinear form `M`. -/
103+
theorem integral_bilin_fourierIntegral_eq (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L[ℂ] F →L[ℂ] G) :
104+
∫ ξ, M (𝓕 f ξ) (g ξ) = ∫ x, M (f x) (𝓕 g x) := by
105+
have := VectorFourier.integral_bilin_fourierIntegral_eq_flip M (μ := volume) (ν := volume)
106+
(L := (innerₗ V)) continuous_fourierChar continuous_inner f.integrable g.integrable
107+
rwa [flip_innerₗ] at this
108+
109+
theorem integral_sesq_fourierIntegral_eq (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L⋆[ℂ] F →L[ℂ] G) :
110+
∫ ξ, M (𝓕 f ξ) (g ξ) = ∫ x, M (f x) (𝓕⁻ g x) := by
111+
have := VectorFourier.integral_sesq_fourierIntegral_eq_neg_flip M (μ := volume) (ν := volume)
112+
(L := (innerₗ V)) continuous_fourierChar continuous_inner f.integrable g.integrable
113+
rwa [flip_innerₗ] at this
114+
115+
/-- Plancherel's theorem for Schwartz functions.
116+
117+
Version where the multiplication is replaced by a general bilinear form `M`. -/
118+
theorem integral_sesq_fourier_fourier (f : 𝓢(V, E)) (g : 𝓢(V, F)) (M : E →L⋆[ℂ] F →L[ℂ] G) :
119+
∫ ξ, M (𝓕 f ξ) (𝓕 g ξ) = ∫ x, M (f x) (g x) := by
120+
simpa only [fourierTransformCLM_apply, fourier_inversion]
121+
using integral_sesq_fourierIntegral_eq f (fourierTransformCLM ℂ g) M
122+
123+
variable {H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℂ H] [CompleteSpace H]
124+
125+
/-- Plancherel's theorem for Schwartz functions. -/
126+
theorem integral_inner_fourier_fourier (f g : 𝓢(V, H)) :
127+
∫ ξ, ⟪𝓕 f ξ, 𝓕 g ξ⟫ = ∫ x, ⟪f x, g x⟫ :=
128+
integral_sesq_fourier_fourier f g (innerSL ℂ)
129+
130+
theorem integral_norm_sq_fourier (f : 𝓢(V, H)) :
131+
∫ ξ, ‖𝓕 f ξ‖^2 = ∫ x, ‖f x‖^2 := by
132+
apply Complex.ofRealLI.injective
133+
simp only [← LinearIsometry.integral_comp_comm]
134+
convert integral_inner_fourier_fourier f f <;>
135+
simp [inner_self_eq_norm_sq_to_K]
136+
137+
theorem inner_fourierTransformCLM_toL2_eq (f : 𝓢(V, H)) :
138+
⟪(fourierTransformCLM ℂ f).toLp 2, (fourierTransformCLM ℂ f).toLp 2⟫ =
139+
⟪f.toLp 2, f.toLp 2⟫ := by
140+
simp only [inner_toL2_toL2_eq]
141+
exact integral_sesq_fourier_fourier f f (innerSL ℂ)
142+
143+
theorem norm_fourierTransformCLM_toL2_eq (f : 𝓢(V, H)) :
144+
‖(fourierTransformCLM ℂ f).toLp 2‖ = ‖f.toLp 2‖ := by
145+
simp_rw [norm_eq_sqrt_re_inner (𝕜 := ℂ), inner_fourierTransformCLM_toL2_eq]
146+
83147
/-- The Fourier transform on a real inner product space, as a continuous linear equiv on the
84148
Schwartz space. -/
85149
noncomputable def fourierTransformCLE : 𝓢(V, E) ≃L[𝕜] 𝓢(V, E) where

Mathlib/Analysis/Distribution/SchwartzSpace.lean

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Mathlib.Analysis.SpecialFunctions.JapaneseBracket
1313
import Mathlib.Topology.Algebra.UniformFilterBasis
1414
import Mathlib.MeasureTheory.Integral.IntegralEqImproper
1515
import Mathlib.Tactic.MoveAdd
16+
import Mathlib.MeasureTheory.Function.L2Space
1617

1718
/-!
1819
# Schwartz space
@@ -67,7 +68,7 @@ noncomputable section
6768

6869
open scoped Nat NNReal ContDiff
6970

70-
variable {𝕜 𝕜' D E F G V : Type*}
71+
variable {𝕜 𝕜' D E F G H V : Type*}
7172
variable [NormedAddCommGroup E] [NormedSpace ℝ E]
7273
variable [NormedAddCommGroup F] [NormedSpace ℝ F]
7374

@@ -1416,6 +1417,25 @@ theorem continuous_toLp {p : ℝ≥0∞} [Fact (1 ≤ p)] {μ : Measure E} [hμ
14161417

14171418
end Lp
14181419

1420+
section L2
1421+
1422+
open MeasureTheory
1423+
1424+
variable [NormedAddCommGroup H] [NormedSpace ℝ H] [FiniteDimensional ℝ H]
1425+
[MeasurableSpace H] [BorelSpace H]
1426+
[NormedAddCommGroup V] [InnerProductSpace ℂ V]
1427+
1428+
@[simp]
1429+
theorem inner_toL2_toL2_eq (f g : 𝓢(H, V)) (μ : Measure H := by volume_tac) [μ.HasTemperateGrowth] :
1430+
inner ℂ (f.toLp 2 μ) (g.toLp 2 μ) = ∫ x, inner ℂ (f x) (g x) ∂μ := by
1431+
apply integral_congr_ae
1432+
have hf_ae := f.coeFn_toLp 2 μ
1433+
have hg_ae := g.coeFn_toLp 2 μ
1434+
filter_upwards [hf_ae, hg_ae] with _ hf hg
1435+
rw [hf, hg]
1436+
1437+
end L2
1438+
14191439
section integration_by_parts
14201440

14211441
open ENNReal MeasureTheory

Mathlib/Analysis/Fourier/FourierTransform.lean

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,39 @@ variable [TopologicalSpace 𝕜] [IsTopologicalRing 𝕜] [TopologicalSpace V] [
167167
{e : AddChar 𝕜 𝕊} {μ : Measure V} {L : V →ₗ[𝕜] W →ₗ[𝕜] 𝕜}
168168
{ν : Measure W} [SigmaFinite μ] [SigmaFinite ν] [SecondCountableTopology V]
169169

170-
variable [CompleteSpace E] [CompleteSpace F]
170+
variable {σ : ℂ →+* ℂ} [RingHomIsometric σ]
171+
172+
/-- Fubini's theorem for the Fourier integral.
171173
174+
This is the main technical step in proving both Parseval's identity and self-adjointness of the
175+
Fourier transform. -/
176+
theorem integral_fourierIntegral_swap
177+
{f : V → E} {g : W → F} (M : F →L[ℂ] E →SL[σ] G) (he : Continuous e)
178+
(hL : Continuous fun p : V × W ↦ L p.1 p.2) (hf : Integrable f μ) (hg : Integrable g ν) :
179+
∫ ξ, (∫ x, M (g ξ) (e (-L x ξ) • f x) ∂μ) ∂ν =
180+
∫ x, (∫ ξ, M (g ξ) (e (-L x ξ) • f x) ∂ν) ∂μ := by
181+
rw [integral_integral_swap]
182+
have : Integrable (fun (p : W × V) ↦ ‖M‖ * (‖g p.1‖ * ‖f p.2‖)) (ν.prod μ) :=
183+
(hg.norm.mul_prod hf.norm).const_mul _
184+
apply this.mono
185+
· change AEStronglyMeasurable (fun p : W × V ↦ (M (g p.1) (e (-(L p.2) p.1) • f p.2) )) _
186+
have A : AEStronglyMeasurable (fun (p : W × V) ↦ e (-L p.2 p.1) • f p.2) (ν.prod μ) := by
187+
refine (Continuous.aestronglyMeasurable ?_).smul hf.1.comp_snd
188+
exact he.comp (hL.comp continuous_swap).neg
189+
have A' : AEStronglyMeasurable (fun p ↦ (g p.1, e (-(L p.2) p.1) • f p.2) : W × V → F × E)
190+
(Measure.prod ν μ) := hg.1.comp_fst.prodMk A
191+
have hM : Continuous (fun q ↦ M q.1 q.2 : F × E → G) :=
192+
-- There is no `Continuous.clm_apply` for semilinear continuous maps
193+
(M.flip.cont.comp continuous_snd).clm_apply continuous_fst
194+
apply hM.comp_aestronglyMeasurable A' -- `exact` works, but `apply` is 10x faster!
195+
· filter_upwards with ⟨ξ, x⟩
196+
simp only [Function.uncurry_apply_pair, norm_mul, norm_norm, ge_iff_le, ← mul_assoc]
197+
convert M.le_opNorm₂ (g ξ) (e (-L x ξ) • f x) using 2
198+
simp
199+
200+
variable [CompleteSpace E] [CompleteSpace F]
172201
/-- The Fourier transform satisfies `∫ 𝓕 f * g = ∫ f * 𝓕 g`, i.e., it is self-adjoint.
202+
173203
Version where the multiplication is replaced by a general bilinear form `M`. -/
174204
theorem integral_bilin_fourierIntegral_eq_flip
175205
{f : V → E} {g : W → F} (M : E →L[ℂ] F →L[ℂ] G) (he : Continuous e)
@@ -178,33 +208,15 @@ theorem integral_bilin_fourierIntegral_eq_flip
178208
∫ x, M (f x) (fourierIntegral e ν L.flip g x) ∂μ := by
179209
by_cases hG : CompleteSpace G; swap; · simp [integral, hG]
180210
calc
181-
_ = ∫ ξ, M.flip (g ξ) (∫ x, e (-L x ξ) • f x ∂μ) ∂ν := rfl
182-
_ = ∫ ξ, (∫ x, M.flip (g ξ) (e (-L x ξ) • f x) ∂μ) ∂ν := by
211+
∫ ξ, M.flip (g ξ) (∫ x, e (-L x ξ) • f x ∂μ) ∂ν
212+
= ∫ ξ, (∫ x, M.flip (g ξ) (e (-L x ξ) • f x) ∂μ) ∂ν := by
183213
congr with ξ
184214
apply (ContinuousLinearMap.integral_comp_comm _ _).symm
185215
exact (fourierIntegral_convergent_iff he hL _).2 hf
186-
_ = ∫ x, (∫ ξ, M.flip (g ξ) (e (-L x ξ) • f x) ∂ν) ∂μ := by
187-
rw [integral_integral_swap]
188-
have : Integrable (fun (p : W × V) ↦ ‖M‖ * (‖g p.1‖ * ‖f p.2‖)) (ν.prod μ) :=
189-
(hg.norm.mul_prod hf.norm).const_mul _
190-
apply this.mono
191-
· -- This proof can be golfed but becomes very slow; breaking it up into steps
192-
-- speeds up compilation.
193-
change AEStronglyMeasurable (fun p : W × V ↦ (M (e (-(L p.2) p.1) • f p.2) (g p.1))) _
194-
have A : AEStronglyMeasurable (fun (p : W × V) ↦ e (-L p.2 p.1) • f p.2) (ν.prod μ) := by
195-
refine (Continuous.aestronglyMeasurable ?_).smul hf.1.comp_snd
196-
exact he.comp (hL.comp continuous_swap).neg
197-
have A' : AEStronglyMeasurable (fun p ↦ (g p.1, e (-(L p.2) p.1) • f p.2) : W × V → F × E)
198-
(Measure.prod ν μ) := hg.1.comp_fst.prodMk A
199-
have B : Continuous (fun q ↦ M q.2 q.1 : F × E → G) := M.flip.continuous₂
200-
apply B.comp_aestronglyMeasurable A' -- `exact` works, but `apply` is 10x faster!
201-
· filter_upwards with ⟨ξ, x⟩
202-
rw [Function.uncurry_apply_pair, Submonoid.smul_def, (M.flip (g ξ)).map_smul,
203-
← Submonoid.smul_def, Circle.norm_smul, ContinuousLinearMap.flip_apply,
204-
norm_mul, norm_norm M, norm_mul, norm_norm, norm_norm, mul_comm (‖g _‖), ← mul_assoc]
205-
exact M.le_opNorm₂ (f x) (g ξ)
216+
_ = ∫ x, (∫ ξ, M.flip (g ξ) (e (-L x ξ) • f x) ∂ν) ∂μ :=
217+
integral_fourierIntegral_swap M.flip he hL hf hg
206218
_ = ∫ x, (∫ ξ, M (f x) (e (-L.flip ξ x) • g ξ) ∂ν) ∂μ := by
207-
simp only [ContinuousLinearMap.flip_apply, ContinuousLinearMap.map_smul_of_tower,
219+
simp only [ContinuousLinearMap.flip_apply, ContinuousLinearMap.map_smul_of_tower,
208220
ContinuousLinearMap.coe_smul', Pi.smul_apply, LinearMap.flip_apply]
209221
_ = ∫ x, M (f x) (∫ ξ, e (-L.flip ξ x) • g ξ ∂ν) ∂μ := by
210222
congr with x
@@ -220,6 +232,42 @@ theorem integral_fourierIntegral_smul_eq_flip
220232
∫ x, (f x) • (fourierIntegral e ν L.flip g x) ∂μ :=
221233
integral_bilin_fourierIntegral_eq_flip (ContinuousLinearMap.lsmul ℂ ℂ) he hL hf hg
222234

235+
/-- The Fourier transform satisfies `∫ 𝓕 f * conj g = ∫ f * conj (𝓕⁻¹ g)`, which together
236+
with the Fourier inversion theorem yields Plancherel's theorem. The stated version is more
237+
convenient since it does only require integrability of `f` and `g`.
238+
239+
Version where the multiplication is replaced by a general bilinear form `M`. -/
240+
theorem integral_sesq_fourierIntegral_eq_neg_flip
241+
{f : V → E} {g : W → F} (M : E →L⋆[ℂ] F →L[ℂ] G) (he : Continuous e)
242+
(hL : Continuous fun p : V × W ↦ L p.1 p.2) (hf : Integrable f μ) (hg : Integrable g ν) :
243+
∫ ξ, M (fourierIntegral e μ L f ξ) (g ξ) ∂ν =
244+
∫ x, M (f x) (fourierIntegral e ν (-L.flip) g x) ∂μ := by
245+
by_cases hG : CompleteSpace G; swap; · simp [integral, hG]
246+
calc
247+
∫ ξ, M.flip (g ξ) (∫ x, e (-L x ξ) • f x ∂μ) ∂ν
248+
= ∫ ξ, (∫ x, M.flip (g ξ) (e (-L x ξ) • f x) ∂μ) ∂ν := by
249+
congr with ξ
250+
apply (ContinuousLinearMap.integral_comp_commSL RCLike.conj_smul _ _).symm
251+
exact (fourierIntegral_convergent_iff he hL _).2 hf
252+
_ = ∫ x, (∫ ξ, M.flip (g ξ) (e (-L x ξ) • f x) ∂ν) ∂μ :=
253+
integral_fourierIntegral_swap M.flip he hL hf hg
254+
_ = ∫ x, (∫ ξ, M (f x) (e (L.flip ξ x) • g ξ) ∂ν) ∂μ := by
255+
congr with x
256+
congr with ξ
257+
rw [← smul_one_smul ℂ _ (f x), ← smul_one_smul ℂ _ (g ξ)]
258+
simp only [map_smulₛₗ, ContinuousLinearMap.flip_apply, LinearMap.flip_apply, RingHom.id_apply,
259+
Circle.smul_def, smul_eq_mul, mul_one, ← Circle.coe_inv_eq_conj, AddChar.map_neg_eq_inv,
260+
inv_inv]
261+
_ = ∫ x, (∫ ξ, M (f x) (e (-(-L.flip ξ) x) • g ξ) ∂ν) ∂μ := by
262+
simp only [LinearMap.flip_apply, ContinuousLinearMap.map_smul_of_tower, LinearMap.neg_apply,
263+
neg_neg]
264+
_ = ∫ x, M (f x) (∫ ξ, e (-(-L.flip ξ) x) • g ξ ∂ν) ∂μ := by
265+
congr with x
266+
apply ContinuousLinearMap.integral_comp_comm
267+
have hLflip : Continuous fun (p : W × V) => (-L.flip p.1) p.2 :=
268+
(continuous_neg.comp hL).comp continuous_swap
269+
exact (fourierIntegral_convergent_iff (L := -L.flip) he hLflip x).2 hg
270+
223271
end Fubini
224272

225273
lemma fourierIntegral_probChar {V W : Type*} {_ : MeasurableSpace V}

docs/1000.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1942,7 +1942,9 @@ Q2094241:
19421942

19431943
Q2096184:
19441944
title: Plancherel theorem
1945-
# also in undergrad.yml
1945+
decl: SchwartzMap.integral_inner_fourier_fourier
1946+
authors: Moritz Doll
1947+
date: 2025
19461948

19471949
Q2109761:
19481950
title: Uniformization theorem

docs/undergrad.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ Measures and integral calculus:
536536
Parseval theorem: 'tsum_sq_fourierCoeff'
537537
Fourier transform on $\mathrm{L}^1(\R^d)$: 'Real.fourierIntegral'
538538
Fourier transform on $\mathrm{L}^2(\R^d)$: ''
539-
Plancherel’s theorem: ''
539+
Plancherel’s theorem: 'SchwartzMap.integral_inner_fourier_fourier'
540540
Fourier inversion formula: 'Continuous.fourier_inversion'
541541

542542
# 11.

0 commit comments

Comments
 (0)