## Sunday, January 31, 2010

### DSP: Using a basic digital filter: Stock market example

Digital filters are very powerful tools in DSP. In this example we will use a digital filter to help with stock market analysis. In the figure above, you can see the raw data plotted with a 5 day moving average and a 20 day moving average. These two moving average lines can be used for buy/sell predictions.

To calculate the 20 day moving average, the window size and filter coefficients must be established. The following Matlab code sets the window size and calculates the filter results. The five day filter is implemented using the same code, with a windowSize = 5. The matrix x in the example contains the raw stock data. For more info on the filt function: http://www.mathworks.com/access/helpdesk/help/techdoc/ref/filter.html

windowSize = 20; % Twenty day average
% The following filter applies the 1/windowSize coefficients
twentyDay = filter(ones(1,windowSize)/windowSize,1,x);

## Thursday, January 28, 2010

### Use of Windowing Techniques on 3G CDMA Signal

Here is an example of how windowing (blackman in this example) can help reduce sidebands. This technique is useful in making spectral measurements such as Adjacent Channel Leakage Ratio. By minimizing the sidebands generated by an arbitrary waveform generator, for example, the true device performance can be more accurately measured. For more information on windowing, see the following article from National Instruments: http://zone.ni.com/devzone/cda/tut/p/id/4844

## Tuesday, January 26, 2010

### Coherent Noise Averaging

% James Eastham
% Member, IEEE
% Revision: R1
% Contact: james.eastham@ieee.org
%
% Description: This script shows the affect of coherent averaging to
% reduce random noise.

%% Affect of Additive Noise
close all; % close all plots
clear all; % clear all variables
fs = 500; % sample freq
Ts=1/fs; % sample period
n=0:1*fs; % time window (fs=samples per second), 1 second
tn=n*Ts; % sample index
x=cos(2*pi*50*tn); % 50Hz sinusoid
k=.5; %noise amplitude
n=randn(size(x)); % random noise
s=x+(k*n); %signal + random noise with amplitude k
% Time domain plot of x(t)=cos(2*pi*50*tn)
figure('Color',[1 1 1]);
plot(tn,s,'g','LineWidth',2);box off;hold on;
title('Sinusoid w/ Additive White Noise');
xlabel('Time(s)');
ylabel('Amplitude');
% Frequency Domain Plot
figure('Color',[1 1 1]);
[X,f]=ComputeSpectrum(s,fs,2^12);
orig_X=X;
h=plot(f,20*log(X));
box off;
grid on;
set(h,'Linewidth',1);
xlabel('Frequency(Hz)');
ylabel('Amplitude(dB)');
title(['Frequency Spectrum w/ Additive Noise k=.5']);
axis([0 250 -50 120]);

%% Example of Noise Averaging, 3 Coherent Averages
fs = 500; % sample freq
Ts=1/fs; % sample period
n=0:1*fs; % time window (fs=samples per second), 1 second
tn=n*Ts; % sample index
x=cos(2*pi*50*tn);
k=.2; %Noise amplitude
n1=randn(size(x));
n2=randn(size(x));
n3=randn(size(x));
s1=x+(k*n1);
s2=x+(k*n2);
s3=x+(k*n3);
average_s=((s1+s2+s3)/3);
% Time domain plot of x(t)=cos(2*pi*50*tn)
figure('Color',[1 1 1]);
h=plot(tn,average_s,'g','LineWidth',2);box off;hold on;
title('Sinusoid w/ Additive White Noise: 3 Averages');
xlabel('Time(s)');
ylabel('Amplitude');
% Frequency Domain Plot
figure('Color',[1 1 1]);
[X,f]=ComputeSpectrum(average_s,fs,2^12);
plot(f,20*log(X),f,20*log(orig_X),'--r');
box off;
grid on;
set(h,'Linewidth',1);
xlabel('Frequency(Hz)');
ylabel('Amplitude(dB)');
legend('3 Averages','Original');
title(['Frequency Spectrum w/ Noise Averaging: 3 Averages']);
axis([0 250 -50 120]);

%% Example of Noise Averaging, 10 Coherent Averages
fs = 500; % sample freq
Ts=1/fs; % sample period
n=0:1*fs; % time window (fs=samples per second), 1 second
tn=n*Ts; % sample index
x=cos(2*pi*50*tn);
k=.2; %Noise amplitude
n1=randn(size(x));
n2=randn(size(x));
n3=randn(size(x));
n4=randn(size(x));
n5=randn(size(x));
n6=randn(size(x));
n7=randn(size(x));
n8=randn(size(x));
n9=randn(size(x));
n10=randn(size(x));
s1=x+(k*n1);
s2=x+(k*n2);
s3=x+(k*n3);
s4=x+(k*n1);
s5=x+(k*n2);
s6=x+(k*n3);
s7=x+(k*n1);
s8=x+(k*n2);
s9=x+(k*n3);
s10=x+(k*n1);
average_s=((s1+s2+s3+s4+s5+s6+s7+s8+s9+s10)/10);
% Time domain plot of x(t)=cos(2*pi*50*tn)
figure('Color',[1 1 1]);
h=plot(tn,average_s,'g','LineWidth',2);box off;hold on;plot(tn,x,'--r');
title('Sinusoid w/ Additive White Noise: 10 Averages');
xlabel('Time(s)');
ylabel('Amplitude');
legend('composite signal','averaged');
% Frequency Domain Plot
figure('Color',[1 1 1]);
[X,f]=ComputeSpectrum(average_s,fs,2^12);
plot(f,20*log(X),f,20*log(orig_X),'--r');
box off;
grid on;
set(h,'Color',[0 0.8 1]);
set(h,'Linewidth',1);
xlabel('Frequency(Hz)');
ylabel('Amplitude(dB)');
title(['Frequency Spectrum w/ Noise Averaging: 10 Averages']);
legend('10 Averages','Original');
axis([0 250 -50 120]);

## Friday, January 22, 2010

### DSP Tutorial #5: Frequency Analysis

This example computes the spectrum of a complex signal using the ComputeSpectrum function.

Couple important things to notice:
- Our range of frequencies on the x-axis is Fs/2
- As Fs increases, the resolution in the frequency domain is much better
- As our FFT bins (2^N) increases, the more bins we have (we can still resolve the freq content provided we meet the sample theorem, we have more bins - basically a finer plot)
- As our windows length increases, the better resolution we have

close all;
clear all;
fs=500;
Ts=1/fs;
n=0:1*fs;
tn=n*Ts;
x=5+cos(2*pi*200*tn)+10+cos(2*pi*100*tn);
% Time Domain Plot
figure('Color',[1 1 1]);
plot(tn,x);box off;
title(['Time Domain Signal']);
[X,f]=ComputeSpectrum(x,fs,2^14);
figure('Color',[1 1 1]);
plot(f,20*log(X));
title(['Freq Domain']);
axis('tight');

### The Compute Spectrum Function

This function uses the FFT algorithm to compute the spectrum of an input with a number of points:

function [X,f]=ComputeSpectrum(x,fs,N);
% ComputeSpectrum Compute the Spectrum
%
% x input signal
% fs Sampling frequency of the input signal
% N number of points to evaluate spectrum (integer number of 2)
%
% X Absolute value of the spectrum (capital X for spectrum)
% f Frequency axis of the spectrum
%
% This function uses the FFT algorithm to compute the spectrum of an
% input signal with a number of points (N) N-point FFT where N must be
% a power of 2 (e.g. 2^10)
%
%Example: Compute the spectrum of sinusoid at 3Hz, fs=36Hz
%
% x=cos(2*pi*3*[0:12*3]*1/(12*3)); 12 times max freq
% [X,f]=ComputeSpectrum(x,12*3,2^12);
%
%Revision:0.0.1 jeastham
%
X=abs(fft(x,N));
f=(fs/N)*[0:N-1]; %make the axis freq
X=X(1:end/2);
f=f(1:end/2);

## Monday, January 18, 2010

### DSP Tutorial #4: Plotting Complex Signals

In this example we will plot a more complex time domain signal in Matlab:

```clear all; %clear all variablesfs = 50; % sample freqTs=1/fs; % sample periodn=0:1*fs; % time window (fs=samples per second), 1 secondtn=n*Ts; % sample indexsig_a=cos(2*pi*5*tn);sig_b=1.5+cos(2*pi*20*tn);x=sig_a+sig_b;% Time domain plot of x(t)=cos(2*pi*5*tn)figure('Color',[1 1 1]);h=plot(tn,x,'g','LineWidth',3);box off;hold on;plot(tn,sig_a,'--r','LineWidth',2);plot(tn,sig_b,'--k','LineWidth',2);title('Example of Composite Signal: 2 Signals Added');legend('Composite','Signal 1','Signal 2');xlabel('Time(s)');ylabel('Amplitude');figure('Color',[1 1 1]);plot(tn,sig_a);title('Stem Plot Example: Fs = 50 (50 Points)');axis('tight'); ```
``` Posted by James Eastham at 9:38 AM No comments: ```
``` ```
``` Sum of Sinusoids Triangle Approximation Triangle Approximation: Sum of Sinusoids ExampleThe following Matlab code provides an example of the fact that any signal can constructed using a sum of sinusoids. clear all; %clear all variablesfs = 50; % sample freqTs=1/fs; % sample periodn=0:1*fs; % time window (fs=samples per second), 1 secondtn=n*Ts; % sample indexwave_1=sin(2*pi*5*tn);wave_2=sin(-1/9*sin(6*pi*5*tn));wave_3=sin(1/25*sin(10*pi*5*tn));wave_4=sin(-1/49*sin(14*pi*5*tn));wave_5=sin(1/81*sin(18*pi*5*tn));wave_6=sin(-1/121*sin(22*pi*5*tn));wave_7=sin(1/169*sin(26*pi*5*tn));x = (8/(pi^2))*(wave_1+wave_2+wave_3+wave_4+wave_5+wave_6+wave_7);% Time domain plot of x(t)=cos(2*pi*5*tn)figure('Color',[1 1 1]);h=plot(tn,wave_1,'--r',tn,wave_2,'--k',tn,x,'g','LineWidth',2);box off;hold on;xlabel('Time(s)');ylabel('Amplitude');title('Square Wave Approximation');axis([0 1 -1.5 1.5]); Posted by James Eastham at 9:15 AM 1 comment: ```
``` Thursday, January 14, 2010 Plotting a Discrete Time-Domain Signal in Matlab <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:199125251; mso-list-type:hybrid; mso-list-template-ids:-543894244 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:.5in; mso-level-number-position:left; text-indent:-.25in;} ol {margin-bottom:0in;} ul {margin-bottom:0in;} --> In order to properly construct a sinusoid in Matlab we need to do a few things. We need to give Matlab the equation of our sinusoid. We also need to tell Matlab how often to sample the sinusoid and for how long we want to sample our sinusoid. Essentially, we want to tell Matlab “ok, watch this 5Hz sinusoid for 1 second. In that one second, take 50 discrete samples (actually 51), and plot the data. I should see a point every 0.02 seconds, for a total of 51 total points (Matlab starts at zero).” What we want to do may seem pretty simple but this process often confuses students. This overview will help in understanding the proper construction of sinusoids. I say “proper” because we will use the proper DSP terms when we tell Matlab what to do. For example, we will use terms like “sample frequency” and “sample period” to describe our signal. To establish our signal we will need to: Set the sample frequency FSSet the sample period TsSet the time window (number of samples)Set the sample index Tn (time index)Establish the signal x(t) and plot 1. Set the Sample Frequency (Fs): This is our sample frequency. This is basically how many “points” we will use to construct each signal. Remember it’s zero based, so it’s really plus one. In the example below, Fs was set to 50, so we have 51 points in our plot, we ‘sample’ the signal 51 times. This is a 5Hz signal, so we are sampling it 10 times per cycle, which satisfies Nyquist-Shannon’s sampling theorem. Matlab code: Fs = 50; <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} --> 2. Set the Sample Period (Ts): Next, we will set the sample period, Ts. The sample period is calculated as 1/Fs, or 1/50 in this example = 0.02. This is essentially the ‘granularity’ of our sampling. In other words we will have a discrete point every 0.02 units (which will be time). If we zoom into our signal and only look at the first 0.2 seconds, we can see that we have 11 datapoints, one data point every 0.02s (remember it’s zero based). <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} --> Matlab code: Ts = 1/Fs; <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} --> 3. Set the Time Window (n): Next we will establish out how many points are in one second of our signal. We will setup a matrix from zero to one second. In our example Fs = 50, so n = 0:1*Fs. When we set n in Matlab, all we are really doing is setting up a matrix of numbers from 0 to 50. That is: 0,1,2,3,4,5,6,…..,50. We will use this matrix to set the sample index Tn in the next step. n is now equal to the matrix below: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Matlab code: n =0:1*Fs; 4. Establish the Sample Index (Tn): Now we will tell Matlab how to chop up or signal. We set the Sample Index as Tn = Ts * n. In our example, Tn will equal .02. We want to see a discrete point every 0.02 seconds. We will take n, or matrix from 0 to 500 and multiply it by Ts which was 0.02. Now we have a matrix with 51 elements from 0 to 1 spaced every 0.02 seconds. We are now ready to plot our sinusoid. Tn is now equal to the matrix below: 0 0.0200 0.0400 0.0600 0.0800 0.1000 0.1200 0.1400 0.1600 0.1800 0.2000 0.2200 0.2400 0.2600 0.2800 0.3000 0.3200 0.3400 0.3600 0.3800 0.4000 0.4200 0.4400 0.4600 0.4800 0.5000 0.5200 0.5400 0.5600 0.5800 0.6000 0.6200 0.6400 0.6600 0.6800 0.7000 0.7200 0.7400 0.7600 0.7800 0.8000 0.8200 0.8400 0.8600 0.8800 0.9000 0.9200 0.9400 0.9600 0.9800 1.0000 Matlab code: Tn =Ts*n; 5. Plot our 5Hz Sinusoid: Plotting our sinusoid is pretty easy at this point. Remember, we want a 5Hz cosine signal constructed of 51 points in one second; we want to “watch” the signal for 1 second and plot the results. We can plot the X axis correctly with time also using tn. clear all; %clear all variables fs = 50; % sample freq Ts=1/fs; % sample period n=0:1*fs; % time window (fs=samples per second), 1 second tn=n*Ts; % sample index sig_a=cos(2*pi*5*tn); figure('Color',[1 1 1]); stem(tn,sig_a); title('Stem Plot Example: Fs = 50 (50 Points)'); axis('tight'); <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} --> Posted by James Eastham at 3:21 PM No comments: Friday, January 8, 2010 DSP Tutorial Matlab Script The script below will get you started plotting basic time domain signals. The following tutorials are available on additional DSP topics:DSP Tutorial #1: Basic PlotsDSP Tutorial #2: Signal CreationDSP Tutorial #3: Sum of SinusoidsDSP Tutorial #4: Complex SignalsDSP Tutorial #5: Frequency AnalysisDSP Tutorial #6: LoopingDSP Tutorial #7: Audio ProcessingDSP Tutorial #8: Spectrum FunctionDSP Tutorial #9: Basic digital filterDSP Tutorial #10: WindowingThis is a simple Matlab script which describes the basic plotting of time-domain signals.%% DSP Tutorial Script% James Eastham% Member, IEEE% Created on: 01/08/2010% Revision: R1%% Plotting a Basic Time Domain Signals% Sinewave with a peak amplitude of 1 and a fequency of freqclear all;close all;freq = 5; %5Hzn=0:.01:.2; %number of discrete values on X axisx = cos (2*pi*freq*n); %our cosine signalfigure('Color',[1 1 1]);plot(n,x);title('Example of Tim-Domain Signal');xlabel('Time(s)');ylabel('Amplitude');%% Plotting a Basic Time Domain Signal Continuedfigure('Color',[1 1 1]);stem(n,x,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','Markersize',10);hold on;plot(n,x);title('Example of Time-Domain Signal Plot');xlabel('Time(s)');ylabel('Amplitude');%% Plotting with the Subplot Feature% subplot(m,n,p) breaks the figure window into an% m-by-n matrixfigure('Color',[1 1 1]);subplot(2,1,1);plot(n,x);title('Example of the Time-Domain Signal');xlabel('Time(s)');ylabel('Amplitude');ns=1:length(n);subplot(2,1,2);stem(ns,x,'.r');title('Example of the Descrete Points');xlabel('Descrete Sample');ylabel('Amplitude');axis([1 21 -1.2 1.2]);grid on; Posted by James Eastham at 8:40 PM 2 comments: ```
``` Newer Posts Older Posts Home Subscribe to: Posts (Atom) window.___gcfg = { 'lang': 'en' }; ```
``` ```
``` ```
``` About Twitter Linkin Profile With my bikes 2008 (2008 Ninja250 & 1974 Ducati Mark3 450) Contact Info RFWarrior@yahoo.com Tech Posts: Electronics LM741 Datasheet Thick Lines in LTSpice Modeling diode breakdown in LTSpice Temp Sweeps in LTSpice - Part I Temp Sweeps in LTSpice - Part 2 Modeling LM741 Slew Rate in LTSpice Exporting LTSpice Data NE5532 LTSpice Model LM741 LTSpice Model LTSpice Introduction LM741 Datasheet VCVS Modeling in LTSpice Parameter Sweeps: .step Grading Rubric Tech Posts (DSP and Comm) Matlab Interpolation Compute Spectrum Function Foruier Additivity Plotting Normal Distributions Fourier Transform for Dummies Matlab: Random Numbers Simple FM Modulator for LTSpice Receiver Sensitivity RF Link Budget Creating a Terrain Profile DSP Tutorial #1: Basic Plots DSP Tutorial #2: Signal Creation DSP Tutorial #3: Sum of Sinusoids DSP Tutorial #4: Complex Signals DSP Tutorial #5: Frequency Analysis DSP Tutorial #6: Looping DSP Tutorial #7: Audio Processing DSP Tutorial #8: Spectrum Function DSP Tutorial #9: Basic digital filter DSP Tutorial #10: Windowing DSP Tutorial #11: Filters DSP: Sample Audio File (fp3.wav) DSP: WCDMA File (wcdma2.csv) DSP: Raw Stock Data File DSP: Obtaining Raw Stock Data DSP: Coherent Noise Averaging DSP: 3G WCDMA Windowing DSP: Noise Averaging WCDMA Technology Management Super Cruncers Book Review LP Compensation Technical Presentation Tips Effective Team Leadership Papers LP Compensation (IEEE) Mantech - Yield Mgmt. WCDMA Noise Averaging RF Shielding Considerations IS-95a Capacity Analysis Temp Controlled V_Source DTV Optimization My Groups Moto 68HC12 LTSpice 902MHz Group Excel Training Installing Solver 2007 History of Microsoft Excel Extended ASCII Key Codes Excel (Office) Shortcut Keys Excel Training Workbook Excel Training - Warmup.xls Excel Training - Activity2-3.xls Excel Training - Activity8-16.xls Educational Links eeweb forums PSU Blackboard My PSU My OIT Tom Almy Forums Tom Almy's Site Raw MOV videos (ms.pdx.oit.edu) Videos (Mediaview) OIT Portland LTSpice Videos LTSpice WebCT Dr. Aboy Moodle OIT Moodle Other Links RF Cafe Agilent Educator Corner EDA Boards RCR IEEE Blog Archive May (1) May (1) November (1) September (1) October (1) May (1) April (1) February (1) January (1) December (1) November (2) October (2) September (3) July (1) March (1) November (1) October (3) September (1) August (1) May (4) April (5) February (8) January (9) November (2) October (1) August (1) June (1) April (1) January (2) December (1) October (3) March (2) February (2) January (1) ```
``` ```
``` ```
``` ```
``` ```
``` Free Counters Awesome Inc. theme. Powered by Blogger. ```
``` ```
``` ```
``` ```
``` window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); window['__wavt'] = 'AOuZoY7cbKRU3yvWmW3bwFlrIHaVzHghHQ:1545018627650';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d5732015422208460018','//jeastham.blogspot.com/2010/01/','5732015422208460018'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '5732015422208460018', 'title': 'James Eastham', 'url': 'http://jeastham.blogspot.com/2010/01/', 'canonicalUrl': 'http://jeastham.blogspot.com/2010/01/', 'homepageUrl': 'http://jeastham.blogspot.com/', 'searchUrl': 'http://jeastham.blogspot.com/search', 'canonicalHomepageUrl': 'http://jeastham.blogspot.com/', 'blogspotFaviconUrl': 'http://jeastham.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': '', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22James Eastham - Atom\x22 href\x3d\x22http://jeastham.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22James Eastham - RSS\x22 href\x3d\x22http://jeastham.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22James Eastham - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/5732015422208460018/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'ieCssRetrofitLinks': '\x3c!--[if IE]\x3e\x3cscript type\x3d\x22text/javascript\x22 src\x3d\x22https://www.blogger.com/static/v1/jsbin/864213505-ieretrofit.js\x22\x3e\x3c/script\x3e\n\x3c![endif]--\x3e', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/dfe7a6f3abc09237', 'plusOneApiSrc': 'https://apis.google.com/js/plusone.js', 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'Twitter', 'key': 'twitter', 'shareMessage': 'Share to Twitter', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Google+', 'key': 'googlePlus', 'shareMessage': 'Share to Google+', 'target': 'googleplus'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'googlePlusShareButtonWidth': 300, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': 'January 2010', 'pageTitle': 'James Eastham: January 2010'}}, {'name': 'features', 'data': {'sharing_get_link_dialog': 'true', 'sharing_native': 'false'}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'Awesome Inc.', 'localizedName': 'Awesome Inc.', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': false, 'variant': 'dark', 'variantId': 'dark'}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'James Eastham', 'description': '', 'url': 'http://jeastham.blogspot.com/2010/01/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2010, 'month': 1, 'rangeMessage': 'Showing posts from January, 2010'}}}]); _WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/1400250419-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/368954415-lightbox_bundle.css'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_TextListView', new _WidgetInfo('TextList2', 'sidebar-right-1', document.getElementById('TextList2'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_ImageView', new _WidgetInfo('Image1', 'sidebar-right-1', document.getElementById('Image1'), {'resize': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_TextListView', new _WidgetInfo('TextList1', 'sidebar-right-1', document.getElementById('TextList1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList10', 'sidebar-right-1', document.getElementById('LinkList10'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList8', 'sidebar-right-1', document.getElementById('LinkList8'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList9', 'sidebar-right-1', document.getElementById('LinkList9'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList3', 'sidebar-right-1', document.getElementById('LinkList3'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList7', 'sidebar-right-1', document.getElementById('LinkList7'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList4', 'sidebar-right-1', document.getElementById('LinkList4'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList1', 'sidebar-right-1', document.getElementById('LinkList1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LinkListView', new _WidgetInfo('LinkList5', 'sidebar-right-1', document.getElementById('LinkList5'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'footer-1', document.getElementById('HTML1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML2', 'footer-2-1', document.getElementById('HTML2'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); ```