Skip to content

Commit

Permalink
Accommodate AbstractFFTs PR 26 (#322)
Browse files Browse the repository at this point in the history
Bound FFTW to 1.1 to avoid conflicting export of Frequencies et al., set
verion to 0.6.1.
  • Loading branch information
ararslan authored Nov 10, 2019
1 parent 1ca3c74 commit ce1e15c
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 75 deletions.
8 changes: 6 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "DSP"
uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2"
version = "0.6.0"
version = "0.6.1"

[deps]
FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
Expand All @@ -12,7 +12,11 @@ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[compat]
Polynomials = ">= 0.1.0"
FFTW = "1.1"
OffsetArrays = "0.11"
Polynomials = "0.6"
Reexport = "0.2"
SpecialFunctions = "0.8"
julia = "1"

[extras]
Expand Down
2 changes: 0 additions & 2 deletions docs/src/util.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ end
unwrap
unwrap!
hilbert
fftfreq
rfftfreq
nextfastfft
pow2db
amp2db
Expand Down
4 changes: 4 additions & 0 deletions src/deprecated.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ Base.@deprecate_binding TFFilter PolynomialRatio
Base.@deprecate_binding BiquadFilter Biquad
Base.@deprecate_binding SOSFilter SecondOrderSections

Base.@deprecate Frequencies(nreal::Int, n::Int, multiplier::Float64) FFTW.Frequencies(nreal, n, multiplier)
Base.@deprecate fftfreq(n::Int, fs::Real=1) FFTW.fftfreq(n, fs)
Base.@deprecate rfftfreq(n::Int, fs::Real=1) FFTW.rfftfreq(n, fs)

@deprecate conv2 conv
7 changes: 4 additions & 3 deletions src/periodograms.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ using ..Util, ..Windows
export arraysplit, nextfastfft, periodogram, welch_pgram, mt_pgram,
spectrogram, power, freq, stft
using FFTW
import FFTW: Frequencies, fftfreq, rfftfreq

## ARRAY SPLITTER

Expand Down Expand Up @@ -218,11 +219,11 @@ See also: [`fftfreq`](@ref), [`rfftfreq`](@ref)
freq(p::TFR) = p.freq
freq(p::Periodogram2) = (p.freq1, p.freq2)
FFTW.fftshift(p::Periodogram{T,F}) where {T,F<:Frequencies} =
Periodogram(p.freq.nreal == p.freq.n ? p.power : fftshift(p.power), fftshift(p.freq))
Periodogram(p.freq.n_nonnegative == p.freq.n ? p.power : fftshift(p.power), fftshift(p.freq))
FFTW.fftshift(p::Periodogram{T,F}) where {T,F<:AbstractRange} = p
# 2-d
FFTW.fftshift(p::Periodogram2{T,F1,F2}) where {T,F1<:Frequencies,F2<:Frequencies} =
Periodogram2(p.freq1.nreal == p.freq1.n ? fftshift(p.power,2) : fftshift(p.power), fftshift(p.freq1), fftshift(p.freq2))
Periodogram2(p.freq1.n_nonnegative == p.freq1.n ? fftshift(p.power,2) : fftshift(p.power), fftshift(p.freq1), fftshift(p.freq2))
FFTW.fftshift(p::Periodogram2{T,F1,F2}) where {T,F1<:AbstractRange,F2<:Frequencies} =
Periodogram2(fftshift(p.power,2), p.freq1, fftshift(p.freq2))
FFTW.fftshift(p::Periodogram2{T,F1,F2}) where {T,F1<:AbstractRange,F2<:AbstractRange} = p
Expand Down Expand Up @@ -442,7 +443,7 @@ struct Spectrogram{T,F<:Union{Frequencies,AbstractRange}} <: TFR{T}
time::FloatRange{Float64}
end
FFTW.fftshift(p::Spectrogram{T,F}) where {T,F<:Frequencies} =
Spectrogram(p.freq.nreal == p.freq.n ? p.power : fftshift(p.power, 1), fftshift(p.freq), p.time)
Spectrogram(p.freq.n_nonnegative == p.freq.n ? p.power : fftshift(p.power, 1), fftshift(p.freq), p.time)
FFTW.fftshift(p::Spectrogram{T,F}) where {T,F<:AbstractRange} = p

"""
Expand Down
47 changes: 0 additions & 47 deletions src/util.jl
Original file line number Diff line number Diff line change
Expand Up @@ -108,53 +108,6 @@ fftabs2type(::Type{Complex{T}}) where {T<:FFTW.fftwReal} = T
fftabs2type(::Type{T}) where {T<:FFTW.fftwReal} = T
fftabs2type(::Type{T}) where {T<:Union{Real,Complex}} = Float64

## FREQUENCY VECTOR

struct Frequencies <: AbstractVector{Float64}
nreal::Int
n::Int
multiplier::Float64
end

unsafe_getindex(x::Frequencies, i::Int) =
(i-1+ifelse(i <= x.nreal, 0, -x.n))*x.multiplier
function Base.getindex(x::Frequencies, i::Int)
(i >= 1 && i <= x.n) || throw(BoundsError())
unsafe_getindex(x, i)
end
if isdefined(Base, :iterate)
function Base.iterate(x::Frequencies, i::Int=1)
i > x.n ? nothing : (unsafe_getindex(x,i), i + 1)
end
else
Base.start(x::Frequencies) = 1
Base.next(x::Frequencies, i::Int) = (unsafe_getindex(x, i), i+1)
Base.done(x::Frequencies, i::Int) = i > x.n
end
Base.size(x::Frequencies) = (x.n,)
Base.step(x::Frequencies) = x.multiplier

"""
fftfreq(n, fs=1)
Return discrete fourier transform sample frequencies. The returned
Frequencies object is an AbstractVector containing the frequency
bin centers at every sample point. `fs` is the sample rate of the
input signal.
"""
fftfreq(n::Int, fs::Real=1) = Frequencies(((n-1) >> 1)+1, n, fs/n)

"""
rfftfreq(n, fs=1)
Return discrete fourier transform sample frequencies for use with
`rfft`. The returned Frequencies object is an AbstractVector
containing the frequency bin centers at every sample point. `fs`
is the sample rate of the input signal.
"""
rfftfreq(n::Int, fs::Real=1) = Frequencies((n >> 1)+1, (n >> 1)+1, fs/n)
FFTW.fftshift(x::Frequencies) = (x.nreal-x.n:x.nreal-1)*x.multiplier

# Get next fast FFT size for a given signal length
const FAST_FFT_SIZES = [2, 3, 5, 7]
"""
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using DSP, FFTW, Test
import DSP: Frequencies, fftfreq, rfftfreq

using Random: seed!

Expand Down
21 changes: 0 additions & 21 deletions test/util.jl
Original file line number Diff line number Diff line change
Expand Up @@ -50,27 +50,6 @@ using Statistics: mean
end

@testset "fft helpers" begin
## FFTFREQ
@test fftfreq(1) [0.]
@test fftfreq(2) [0., -1/2]
@test fftfreq(2, 1/2) [0., -1/4]
@test fftfreq(3) [0., 1/3, -1/3]
@test fftfreq(3, 1/2) [0., 1/6, -1/6]
@test fftfreq(6) [0., 1/6, 1/3, -1/2, -1/3, -1/6]
@test fftfreq(7) [0., 1/7, 2/7, 3/7, -3/7, -2/7, -1/7]

@test rfftfreq(1) [0.]
@test rfftfreq(2) [0., 1/2]
@test rfftfreq(2, 1/2) [0., 1/4]
@test rfftfreq(3) [0., 1/3]
@test rfftfreq(3, 1/2) [0., 1/6]
@test rfftfreq(6) [0., 1/6, 1/3, 1/2]
@test rfftfreq(7) [0., 1/7, 2/7, 3/7]

for n = 1:7
@test fftshift(fftfreq(n)) fftshift([fftfreq(n);])
end

@test meanfreq(sin.(2*π*10*(0:1e-3:10*π)),1e3) 10.0 rtol=1e-3

# nextfastfft
Expand Down

2 comments on commit ce1e15c

@ararslan
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/5248

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if Julia TagBot is installed, or can be done manually through the github interface, or via:

git tag -a v0.6.1 -m "<description of version>" ce1e15c9b703302c39133db60835bbfc31ec3b0e
git push origin v0.6.1

Please sign in to comment.