Skip to content

Commit 18b3e91

Browse files
Refactor testFFT (#242)
* Moved the block of code to a clearly named test. * Clarified the name of the temporary variable. * Clarified the name of the temporary variable. * Clarified the name of the temporary variable. * Formatted the test to follow the arrange, act and assert form. * Grouped the assertions together. * Extracted a computation to an intention-revealing temporary variable. * Clarified the name of the test. * Extracted block of test code to a clearly named test method. * Removed obsolete code. * Clarified the name of the test. * Formatted the test to follow the arrange, act and assert form. * Improved the name of the temporary variable. * Copied block of test code to a clearly named test method. * Removed obsolete, duplicated code. * Formatted the test to follow the arrange, act and assert form. * Improved the names of the test messages. * Clarified the name of the temporary variable. * Made similar code even more similar. * Made similar code even more similar. * Extracted duplicate code to an intention revealing message. * Inlined the temporary variable. * Made similar code even more similar. * Made similar code even more similar. * Made similar code even more similar. * Replaced the use of a deprecated method. * Clarified the name of the test message. * Made the name of the test message more concise by an attempt to use the domain language (Wikipedia). * Improved code formatting. * Clarified the name of a temporary variable.
1 parent 18bd1fb commit 18b3e91

File tree

2 files changed

+59
-24
lines changed

2 files changed

+59
-24
lines changed

src/Math-FastFourierTransform/PMFastFourierTransform.class.st

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Class {
1414
'permTable',
1515
'data'
1616
],
17-
#category : 'Math-FastFourierTransform'
17+
#category : #'Math-FastFourierTransform'
1818
}
1919

2020
{ #category : #'instance creation' }
@@ -140,7 +140,7 @@ PMFastFourierTransform >> transformForward: forward [
140140
[ :j |
141141
temp := self multiplier: (j - 1) * (n // lev).
142142
forward
143-
ifFalse: [ temp := temp conjugated ].
143+
ifFalse: [ temp := temp complexConjugate ].
144144
i := j.
145145
[ i <= n ]
146146
whileTrue:

src/Math-Tests-FastFourierTransform/PMFFTTest.class.st

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ Class {
44
#category : #'Math-Tests-FastFourierTransform'
55
}
66

7+
{ #category : #tests }
8+
PMFFTTest >> generateCosineWaveSignal: sampleSize [
9+
10+
^ (1 to: sampleSize) collect: [ :i |
11+
(Float pi * (i - 1) / (sampleSize / 8)) cos ]
12+
]
13+
714
{ #category : #tests }
815
PMFFTTest >> testBitReverse [
916
self should: [ 1 bitReverse: 0 ] raise: Error.
@@ -21,35 +28,63 @@ PMFFTTest >> testBitReverse [
2128
]
2229

2330
{ #category : #tests }
24-
PMFFTTest >> testFFT [
25-
| data data1 f s |
26-
data := (1 to: 256)
27-
collect: [ :i | (Float pi * (i - 1) / (256 / 8)) cos ].
28-
f := PMFastFourierTransform data: data.
31+
PMFFTTest >> testFastFourierTransformCalculatesTheDiscreteFourierTransformWithoutLossOfSignalForLargeDataSets [
32+
33+
| inputSequence f zeroedImaginaryData inputOutputDiff zeroedRealData |
34+
inputSequence := self generateCosineWaveSignal: 256.
35+
f := PMFastFourierTransform data: inputSequence.
36+
2937
f transform.
3038
f inverseTransform.
31-
s := (f imaginaryData select: [ :i | i equalsTo: 0 ]) size.
32-
self assert: s equals: 256.
33-
s := (f realData - data select: [ :i | i equalsTo: 0 ]) size.
34-
self assert: s equals: 256.
35-
PMMitchellMooreGenerator reset: 1.
36-
data1 := data collect: [ :i | i + 0.001 random - 0.0005 ].
37-
f := PMFastFourierTransform data: data1.
39+
40+
zeroedImaginaryData := (f imaginaryData select: [ :i | i equalsTo: 0 ]) size.
41+
inputOutputDiff := f realData - inputSequence.
42+
zeroedRealData := (inputOutputDiff select: [ :i | i equalsTo: 0 ]) size.
43+
self assert: zeroedImaginaryData equals: 256.
44+
self assert: zeroedRealData equals: 256.
45+
46+
PMMitchellMooreGenerator reset: 1
47+
]
48+
49+
{ #category : #tests }
50+
PMFFTTest >> testFastFourierTransformCalculatesTheDiscreteFourierTransformWithoutLossOfSignalForSmallDataSets [
51+
52+
| inputSequence f zeroedImaginaryData inputOutputDiff zeroedRealData |
53+
inputSequence := #( -2 -2 -2 3 3 3 1 -2 ).
54+
f := PMFastFourierTransform data: inputSequence.
55+
56+
f transform.
57+
f inverseTransform.
58+
59+
zeroedImaginaryData := (f imaginaryData select: [ :i | i equalsTo: 0 ]) size.
60+
inputOutputDiff := f realData - inputSequence.
61+
zeroedRealData := (inputOutputDiff select: [ :i | i equalsTo: 0 ]) size.
62+
self assert: zeroedImaginaryData equals: 8.
63+
self assert: zeroedRealData equals: 8
64+
]
65+
66+
{ #category : #tests }
67+
PMFFTTest >> testFrequencyDomainRepresentationMatchesRandomizedInputSignalClosely [
68+
69+
| cosineWaveSignal randomizedCosineWaveSignal f |
70+
cosineWaveSignal := self generateCosineWaveSignal: 256.
71+
randomizedCosineWaveSignal := cosineWaveSignal collect: [ :i | i + 0.001 random - 0.0005 ].
72+
f := PMFastFourierTransform data: randomizedCosineWaveSignal.
73+
3874
f transform.
3975
f chop: 0.01.
4076
f inverseTransform.
41-
self assert: (f realData - data) abs max < 4e-5.
42-
data := #(-2 -2 -2 3 3 3 1 -2).
43-
f := PMFastFourierTransform data: data.
77+
78+
self assert: (f realData - cosineWaveSignal) abs max < 4e-5
79+
]
80+
81+
{ #category : #tests }
82+
PMFFTTest >> testThatChopSuccessivelyRemovesInputSignalPointsLowerThanTolerance [
83+
| inputSignal f |
84+
inputSignal := #(-2 -2 -2 3 3 3 1 -2).
85+
f := PMFastFourierTransform data: inputSignal.
4486
f chop: 1.01.
4587
self assert: f realData equals: #(-2 -2 -2 3 3 3 0 -2).
4688
f chop: 2.01.
4789
self assert: f realData equals: #(0 0 0 3 3 3 0 0).
48-
f data: data.
49-
f transform.
50-
f inverseTransform.
51-
s := (f imaginaryData select: [ :i | i equalsTo: 0 ]) size.
52-
self assert: s equals: 8.
53-
s := (f realData - data select: [ :i | i equalsTo: 0 ]) size.
54-
self assert: s equals: 8
5590
]

0 commit comments

Comments
 (0)