Ltspice

From Attie's Wiki
(Difference between revisions)
Jump to: navigation, search
(Created page with "==Using a captured waveform as LTspice input== This outlines the steps necessary to use a CSV file as input for LTspice. ==Capture your waveform== I have captured the followi...")
 
m (Convert the CSV file to a RAW 8-bit file)
Line 22: Line 22:
  
 
==Convert the CSV file to a RAW 8-bit file==
 
==Convert the CSV file to a RAW 8-bit file==
Use the following script below.
+
Use the script below.
 +
There are a few configuration options:
 +
{|
 +
! Option Name !! Description
 +
|-
 +
| CSV_FILE || The source CSV file
 +
|-
 +
| CSV_COLUMN || The column of the CSV file that you'd like to extract
 +
|-
 +
| SAMPLE_RATE || The rate that the samples were stored at, in Hz
 +
|-
 +
| ROOT_FILENAME || <i>(optional)</i> If you want to store the output somewhere else, then change this
 +
|}
 +
 
 
<source lang="bash">
 
<source lang="bash">
 
#!/bin/bash -e
 
#!/bin/bash -e
Line 28: Line 41:
 
CSV_FILE=loaded.csv
 
CSV_FILE=loaded.csv
 
CSV_COLUMN=2
 
CSV_COLUMN=2
 +
 +
SAMPLE_RATE=500000
  
 
ROOT_FILENAME=$(echo ${CSV_FILE} | rev | cut -d . -f 2- | rev)
 
ROOT_FILENAME=$(echo ${CSV_FILE} | rev | cut -d . -f 2- | rev)
Line 44: Line 59:
 
   | tee .${CSV_FILE}.normal \
 
   | tee .${CSV_FILE}.normal \
 
   | sort -n \
 
   | sort -n \
  | uniq \
+
| uniq \
 
   > .${CSV_FILE}.sorted
 
   > .${CSV_FILE}.sorted
 
+
 
cat .${CSV_FILE}.sorted | sed -n "1p;$(wc -l .${CSV_FILE}.sorted | cut -d ' ' -f 1)p" > .${CSV_FILE}.extremes
 
cat .${CSV_FILE}.sorted | sed -n "1p;$(wc -l .${CSV_FILE}.sorted | cut -d ' ' -f 1)p" > .${CSV_FILE}.extremes
  
Line 70: Line 85:
 
   | awk '{printf "%c", strtonum($0)}' \
 
   | awk '{printf "%c", strtonum($0)}' \
 
   > ${ROOT_FILENAME}.raw
 
   > ${ROOT_FILENAME}.raw
 +
 +
DATA_SIZE=$(stat -c%s ${ROOT_FILENAME}.raw)
 +
CHUNK_SIZE=$((DATA_SIZE + 36))
 +
 +
WAV=${ROOT_FILENAME}.wav
 +
 +
# writeNumAsBin
 +
# arg1: bytes used to represent the word
 +
# arg2: value stored in the word
 +
function wnab() {
 +
WORD_SIZE=$1; shift
 +
WORD_VALUE=$1; shift
 +
printf "%0$((WORD_SIZE * 2))x" ${WORD_VALUE} \
 +
| fold -w2 \
 +
| sed '1!G;h;$!d' \
 +
  | awk '{printf "%c", strtonum($0)}'
 +
}
 +
 +
truncate -s0 ${WAV}
 +
 +
# ChunkID
 +
echo "RIFF" >> ${WAV}
 +
# ChunkSize
 +
wnab 4 ${CHUNK_SIZE} >> ${WAV}
 +
# Format & Subchunk1ID
 +
echo "WAVEfmt " >> ${WAV}
 +
# Subchunk1Size
 +
wnab 4 16 >> ${WAV}
 +
# AudioFormat
 +
wnab 2 1 >> ${WAV}
 +
# NumChannels
 +
wnab 2 1 >> ${WAV}
 +
# SampleRate
 +
wnab 4 ${SAMPLE_RATE} >> ${WAV}
 +
# ByteRate
 +
wnab 4 ${SAMPLE_RATE} >> ${WAV}
 +
# BlockAlign
 +
wnab 2 1 >> ${WAV}
 +
# BitsPerSample
 +
wnab 2 8 >> ${WAV}
 +
# Subchunk2ID
 +
echo "data" >> ${WAV}
 +
# Subchunk2Size
 +
wnab 4 ${DATA_SIZE} >> ${WAV}
 +
# data!
 +
cat ${ROOT_FILENAME}.raw >> ${WAV}
 
</source>
 
</source>
 +
 +
Useful resources:
 +
* https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

Revision as of 18:17, 5 October 2013

Using a captured waveform as LTspice input

This outlines the steps necessary to use a CSV file as input for LTspice.

Capture your waveform

I have captured the following waveform using my scope, and saved it as a CSV file.
Bldc waveform.png

A sample of the CSV file is shown below:

x-axis,3,D0-D7
second,Volt,
-1.0000000E-03,-48.2407212E-03,0
-999.8000E-06,-48.2407212E-03,0
-999.6000E-06,-48.2407212E-03,0
-999.4000E-06,-48.2407212E-03,0
- - - - - - - - >8 - - - - - - - -
+8.9990000E-03,-168.8437350E-03,0
+8.9992000E-03,-176.8839359E-03,0
+8.9994000E-03,-48.2407212E-03,0
+8.9996000E-03,-48.2407212E-03,0

Convert the CSV file to a RAW 8-bit file

Use the script below. There are a few configuration options:

Option Name Description
CSV_FILE The source CSV file
CSV_COLUMN The column of the CSV file that you'd like to extract
SAMPLE_RATE The rate that the samples were stored at, in Hz
ROOT_FILENAME (optional) If you want to store the output somewhere else, then change this
#!/bin/bash -e
 
CSV_FILE=loaded.csv
CSV_COLUMN=2
 
SAMPLE_RATE=500000
 
ROOT_FILENAME=$(echo ${CSV_FILE} | rev | cut -d . -f 2- | rev)
 
# end of configuration
 
cat ${CSV_FILE} \
  | tail -n+3 \
  | cut -d , -f ${CSV_COLUMN} \
  | sed -r \
    -e 's/^\+//' \
    -e 's/^(-?[0-9]+\.[0-9]+)[eE]([+-])([0-9]+)$/\1*(10^\2\3)/' \
    -e 's/\*\(10\^\+00\)$//' \
  | bc -l \
  | sed -re 's/^(-?)\./\10./' \
  | tee .${CSV_FILE}.normal \
  | sort -n \
	| uniq \
  > .${CSV_FILE}.sorted
 
cat .${CSV_FILE}.sorted | sed -n "1p;$(wc -l .${CSV_FILE}.sorted | cut -d ' ' -f 1)p" > .${CSV_FILE}.extremes
 
LO=$(cat .${CSV_FILE}.extremes | head -n 1)
if [ $(echo "${LO} < 0" | bc) == "1" ]; then
  OP=-
else
  OP=+
fi
HI=$(echo "($(cat .${CSV_FILE}.extremes | tail -n 1))${OP}(${LO})" | bc -l)
ML=$(echo "255/${HI}" | bc -l)
 
cat .${CSV_FILE}.normal \
  | sed -r \
    -e 's/^/((/' \
    -e 's/$/)/' \
    -e "s/$/${OP}(${LO})/" \
    -e "s/$/)*${ML}/" \
  | bc -l \
  | sed -r \
    -e 's/^([0-9]*).([0-9]?[0-9]?[0-9]?).*$/\1.\2/' \
  | tee .${CSV_FILE}.adjusted \
  | awk '{printf "%c", strtonum($0)}' \
  > ${ROOT_FILENAME}.raw
 
DATA_SIZE=$(stat -c%s ${ROOT_FILENAME}.raw)
CHUNK_SIZE=$((DATA_SIZE + 36))
 
WAV=${ROOT_FILENAME}.wav
 
# writeNumAsBin
# arg1: bytes used to represent the word
# arg2: value stored in the word
function wnab() {
	WORD_SIZE=$1; shift
	WORD_VALUE=$1; shift
	printf "%0$((WORD_SIZE * 2))x" ${WORD_VALUE} \
		| fold -w2 \
		| sed '1!G;h;$!d' \
  	| awk '{printf "%c", strtonum($0)}'
}
 
truncate -s0 ${WAV}
 
# ChunkID
echo "RIFF" >> ${WAV}
# ChunkSize
wnab 4 ${CHUNK_SIZE} >> ${WAV}
# Format & Subchunk1ID
echo "WAVEfmt " >> ${WAV}
# Subchunk1Size
wnab 4 16 >> ${WAV}
# AudioFormat
wnab 2 1 >> ${WAV}
# NumChannels
wnab 2 1 >> ${WAV}
# SampleRate
wnab 4 ${SAMPLE_RATE} >> ${WAV}
# ByteRate
wnab 4 ${SAMPLE_RATE} >> ${WAV}
# BlockAlign
wnab 2 1 >> ${WAV}
# BitsPerSample
wnab 2 8 >> ${WAV}
# Subchunk2ID
echo "data" >> ${WAV}
# Subchunk2Size
wnab 4 ${DATA_SIZE} >> ${WAV}
# data!
cat ${ROOT_FILENAME}.raw >> ${WAV}

Useful resources:

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox