From 93f9e9ac023fab53f90186a09781a53732cc8ac0 Mon Sep 17 00:00:00 2001 From: Matti Pastell Date: Wed, 2 Nov 2016 09:26:10 +0200 Subject: [PATCH] Fix plotly output for markdown, fix examples --- examples/FIR_design.jl | 6 ++- examples/FIR_design_plots.jl | 83 ++++++++++++++++++++++++++++++++++++ src/plots.jl | 5 +++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 examples/FIR_design_plots.jl diff --git a/examples/FIR_design.jl b/examples/FIR_design.jl index 2a49c0d..39fc0a2 100644 --- a/examples/FIR_design.jl +++ b/examples/FIR_design.jl @@ -56,7 +56,6 @@ end #' We will use the Hamming window, which is defined as: #' $w(n) = \alpha - \beta\cos\frac{2\pi n}{N-1}$, where $\alpha=0.54$ and $\beta=0.46$ - fs = 20 f = digitalfilter(Lowpass(5, fs = fs), FIRWindow(hamming(61))) w = linspace(0, pi, 1024) @@ -67,8 +66,11 @@ h = FIRfreqz(f, w) #' The next code chunk is executed in term mode, see the [script](FIR_design.jl) for syntax. #+ term=true -h_db = log10(abs(h)) +h_db = log10(abs(h)); ws = w/pi*(fs/2) + +#+ + plot(y = h_db, x = ws, Geom.line, Guide.xlabel("Frequency (Hz)"), Guide.ylabel("Magnitude (db)")) diff --git a/examples/FIR_design_plots.jl b/examples/FIR_design_plots.jl new file mode 100644 index 0000000..6d7a976 --- /dev/null +++ b/examples/FIR_design_plots.jl @@ -0,0 +1,83 @@ +#' % FIR filter design with Julia +#' % Matti Pastell +#' % 21th April 2016 + +#' # Introduction + +#' This an example of a julia script that can be published using +#' [Weave](http://mpastell.github.io/Weave.jl/latest/usage/). +#' The script can be executed normally using Julia +#' or published to HTML or pdf with Weave. +#' Text is written in markdown in lines starting with "`#'` " and code +#' is executed and results are included in the published document. + +#' Notice that you don't need to define chunk options, but you can using +#' `#+`. just before code e.g. `#+ term=True, caption='Fancy plots.'`. +#' If you're viewing the published version have a look at the +#' [source](FIR_design_plots.jl) to see the markup. + + +#' # FIR Filter Design + +#' We'll implement lowpass, highpass and ' bandpass FIR filters. If +#' you want to read more about DSP I highly recommend [The Scientist +#' and Engineer's Guide to Digital Signal +#' Processing](http://www.dspguide.com/) which is freely available +#' online. + +#' ## Calculating frequency response + +#' DSP.jl package doesn't (yet) have a method to calculate the +#' the frequency response of a FIR filter so we define it: + +using Plots, DSP +plotly() + +function FIRfreqz(b::Array, w = linspace(0, π, 1024)) + n = length(w) + h = Array{Complex64}(n) + sw = 0 + for i = 1:n + for j = 1:length(b) + sw += b[j]*exp(-im*w[i])^-j + end + h[i] = sw + sw = 0 + end + return h +end + + +#' ## Design Lowpass FIR filter + +#' Designing a lowpass FIR filter is very simple to do with DSP.jl, all you +#' need to do is to define the window length, cut off frequency and the +#' window. We will define a lowpass filter with cut off frequency at 5Hz for a signal +#' sampled at 20 Hz. +#' We will use the Hamming window, which is defined as: +#' $w(n) = \alpha - \beta\cos\frac{2\pi n}{N-1}$, where $\alpha=0.54$ and $\beta=0.46$ + + +fs = 20 +f = digitalfilter(Lowpass(5, fs = fs), FIRWindow(hamming(61))) +w = linspace(0, pi, 1024) +h = FIRfreqz(f, w) + +#' ## Plot the frequency and impulse response + +#' The next code chunk is executed in term mode, see the [script](FIR_design.jl) for syntax. +#+ term=true + +h_db = log10(abs(h)); +ws = w/pi*(fs/2) + +#+ + +plot(ws, h_db, + xlabel = "Frequency (Hz)", ylabel = "Magnitude (db)") + +#' And again with default options + +h_phase = unwrap(-atan2(imag(h),real(h))) +plot(ws, h_phase, + xlabel = "Frequency (Hz)", ylabel = "Phase (radians)") diff --git a/src/plots.jl b/src/plots.jl index 76032da..ee9af07 100644 --- a/src/plots.jl +++ b/src/plots.jl @@ -29,6 +29,11 @@ function Base.display(report::Report, m::MIME"image/svg+xml", data::Plots.Plot{P report.rich_output *= "\n" * div * "\n" * plot end +function Base.display(report::Report, m::MIME"image/png", data::Plots.Plot{Plots.PlotlyBackend})# + display(report, MIME("image/svg+xml"), data) +end + + #PNG or SVG is not working, output html function Base.display(report::Report, m::MIME"image/svg+xml", plot::Plots.Plot{Plots.PlotlyJSBackend}) script = ""