## Friday, May 4, 2018

### Thick Schematic Lines in LTSpice

To make nice thick schematic lines in LTSpiace:

1. On the "Tools" menu item, select the "Drafting Options" tab
2. Modify the "Pen Thickness" to the desired thickness ## Wednesday, May 7, 2014

### Implementing filters in Matlab using ellipord and filtfilt

We can create a custom function in Matlab using the built in ellipord and filtfilt functions included in the signal processing toolbox.

Here is a lowpass filter with explanation in the comments. Once we create this lowpass function, we can call this function and simply pass the function our input signal, sampling frequency, and cut-off frequency.

function [y,N,B,A]= lowpass(x,fs,fc);
% Description: This function uses an elliptical filter
% to filter out high frequencies.
%
% [y,N,B,A] = lowpass(x,fs,fc)
%
% Variable Definition:
% x: Input signal
% fs: Input signal sampling frequency in Hz
% fc: cutoff frequency
%
% y: Filtered signal (output)
% N: Filter order
% B: Feedforward (FIR) coefficients
% A: Feedback (IIR) coefficients
Rp = 0.5;   % Ripple in dB (passband)
Rs = 20;    % Attenuation
mf = fs/2;  % Maximum frequency
Wp = fc/mf; % Cuttoff frequency
Ws = 1.2 * Wp; %Stopband frequency
% First, determine the minimum filter order to meet specifics
[N,Wn] = ellipord(Ws,Wp,Rp,Rs);
% Next, Design the filter (find the coefficients)
[B,A] = ellip(N,Rp,Rs,Wn,'low');
% Now, apply the filter (filter the signal)
y = filtfilt(B,A,x);
% Plot the filter
figure('Color',[1 1 1]);
freqz(B,A,2^14,fs);

## Monday, November 11, 2013

### Automatic Sorting in Excel without a Macro (Sort Chart Data)

I really wanted to have a chart on my sheet which was sorted from high to low. Imagine if you wanted to create a bar chart which showed net income by company and wanted the chart to be sorted high to low. One solution is to just manually sort the data. Another option is to create a macro which copies the data somewhere (values only) and sorts the data, then chart the sorted data. These options all require the user to 'do something' to get the sorted chart.

I came up with a new approach using just the MAX feature, VLOOKUP, and a simple IF. The original data is in the left columns C3:C8. I just take the MAX of the group, then use a simple IF statement to assign a "One", "Two", etc, then just a VLOOKUP to get the order back at the bottom of the sheet. The IF statement is just =IF(C4=\$C\$9,"One",C4).

The reason I spell out the rank order is because if you don't do this and have negative numbers the logic will get screwed up as rank "5" will be greater than 99 for example and mess up your order.

Let me know if you have questions, the chart is then done on the table below. Pretty simple.

## Monday, September 9, 2013

### Autocreate Minitab Scripts in C++

The following code will read in a CSV file containing row and reference line data. The program will then create a Minitab script as the output file. This file can then be used directly in Minitab to auto-generate hundreds of plots. This approach can work for auto-generating / automating any scripts in Minitab.

// main_histo-limits.cpp
// James Eastham
// Version 1.0
// Purpose: The purpose of this program is to read in a set of test names and
// limits. Produce minitab script code which can be used to generate a large
// number of histograms with correct reference limit lines.
// Input: The input to this program will be a CSV file containing all the test
// names and LSL/USL for which histograms will be created.
// The input file is hard coded as limits.csv
// Output: The output will be a text file (histolimits.txt) which can be pasted
// directly into minitab and ran as a script
#include
#include
#include ;
#include ;The

using namespace std;

// int argc, char *argv[] are only needed for processing command line
// arguments. This program does not use command line arguments, so
// main() would be fine here.

int main()
{
string testname\$;           // Variable for test name read from CSV
string lsl\$;                // Varialbe for lower spec limit from CSV
string usl\$;                // Variable for upper spec limit from CSV
// Input file name is hardcoded below as testnames.txt
ifstream testnames ("limits.csv");
ofstream myfile;
// Output script file is hardcoded below as histoscript.txt
myfile.open ("histolimits.txt");
if (testnames.is_open())
{
while (testnames.good() )
{
getline (testnames,testname\$,',');  // Read test name from file
getline (testnames,lsl\$,',');       // Read lsl from file
getline (testnames,usl\$);           // Read usl from file
// The following cout lines simply print the info read from CSV
// to the screen for debug purposes
cout << testname\$;
cout << ',';
cout << lsl\$;
cout << ',';
cout << usl\$;
cout << endl;
if (testname\$.length()>30)
{
cout << "***WARNING LONG TEST NAME, Exceeds 30 Charcaters***\n";
}
// The following 'myfile' lines output text to the output file
// 'histolimits.txt'. This txt file is then used in Minitab as
// a script. The testname\$, lsl\$, usl\$ are used in this Minitab script
// for naming each histogram/plot and reference/limit lines.
// This text file can be pasted directly into Minitab.

myfile << "Histogram '";
myfile << testname\$;
myfile << "';\n";
myfile << "Scale 1;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 8;\n";
myfile << "Scale 2;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 8;\n";
myfile << "AxLabel 1;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "AxLabel 2;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 8;\n";
myfile << "NoBold;\n";
myfile << "Table;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "Section 1;\n";
myfile << "NoLegend;\n";
myfile << "Density;\n";
myfile << "Bar 'part_id';\n";
myfile << "Color 3;\n";
myfile << "Distribution 'part_id';\n";
myfile << "Normal;\n";
myfile << "Grid 1;\n";
myfile << "Reference 1 ";
myfile << lsl\$;
myfile << ";\n";
myfile << "Type 3;\n";
myfile << "Color 2;\n";
myfile << "Size 1;\n";
myfile << "MODEL 1;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 8;\n";
myfile << "Reference 1 ";
myfile << usl\$;
myfile << ";\n";
myfile << "Type 3;\n";
myfile << "Color 114;\n";
myfile << "Size 1;\n";
myfile << "MODEL 1;\n";
myfile << "Title \"TM6PP6924 : ";
// The following two remarks are not needed
//myfile << "Title &\n";
//myfile << "\"";
myfile << testname\$;
myfile << "\";\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 12;\n";
myfile << "NoBold;\n";
myfile << "SubTitle;\n";
myfile << "TFont \"Arial Narrow\";\n";
myfile << "PSize 8;\n";
myfile << "StDist;\n";
myfile << "Footnote;\n";
myfile << "FPanel;\n";
myfile << "NoDTitle;\n";
myfile << "NoDSubtitle.\n";

}
testnames.close();   // close the input file
}
else cout << "Unable to open file";

myfile.close();  // close the output file
system("PAUSE");
return EXIT_SUCCESS;
}

## Monday, October 15, 2012

### Matlab Interpolation

Here is a quick example of linear interpolation.

%% Linear Interpolation Example
% James Eastham, Member IEEE
% 10/15/2012
close all;
clear all;
x = 0:100; %Original Data Points
y = sin(x); % sin of original data points
xi = 0:.5:100; % points to interpolate
yi = interp1(x,y,xi); % interpolated vector
figure('Color',[1 1 1]);
subplot(3,1,1);
plot(x,y,'o-g',xi,yi,'.-b')
title('Interpolation Example 1 Points');
xlabel('point');
ylabel('sin(x)');
x = 0:100; %Original Data Points
y = sin(x); % sin of original data points
xi = 0:.25:100; % points to interpolate
yi = interp1(x,y,xi); % interpolated vector
subplot(3,1,2);
plot(x,y,'o',xi,yi,'.-r')
title('Interpolation Example 3 Points');
xlabel('point');
ylabel('sin(x)');
x = 0:100; %Original Data Points
y = sin(x); % sin of original data points
xi = 0:.1:100; % points to interpolate
yi = interp1(x,y,xi); % interpolated vector
subplot(3,1,3);
plot(x,y,'o',xi,yi,'.-g')
title('Interpolation Example 9 Points');
xlabel('point');
ylabel('sin(x)');