Hello World! My name is

Sahil Singh!


I am a software engineer residing in the South Bay Area, CA who specializes in developing software for both embedded and non-embedded applications with a rising passion in AI/ML technologies.

I graduated from the University of California, Santa Cruz with a B.S. in Robotics Engineering and while there I worked on an embedded system prototype for Mercedes-Benz to pinpoint the loudest human speaking in a noisy, enclosed environment.

Outside of software development, I enjoy:

  • practicing and messing around on the guitar!

  • cruising around on my skateboard!

  • mashing on my arcade stick (play other games too)!

  • reading, mostly non-fiction and theory!

Projects

Acoustic Array Emitter Location - Mercedes-Benz

I worked in a team of six multidisciplinary engineers to design and implement a the real-time embedded system prototype for Mercedes-Benz to locate the loudest human talking in noisy enclosed environments. The person's audio is saved and both their audio and location in the car are communicated to a remote system for further processing. The data was transferred over ethernet using the TCP protocol and displayed on a GUI we made in QT.

In the beginning, I lead the research and group discussions behind designing the embedded system. Specifically, a criteria like types of microphones, interfaces, computer networking technologies, a capable CPU, and more. We ended up with a microcontroller from Microchip's PIC32MZ family and an I/O expansion board as an interface to the microphones.

With our microcontroller in-hand, I, familiar with Microchip's IDE, MPLAB X, taught the other members the IDE and managing and flashing projects onto the microcontroller. Afterwards, we broke into our specific roles, paired up with a teammate who worked on the most similar role to keep us in check. My role was to implement the digital anti-aliasing filter to better isolate the human voice among other noise.

I independently studied DSP, mostly watching old MIT lectures and reading this textbook. First, I used MATLAB to design a lowpass filter to attenuate frequencies above 4 kHz. The human voice has a fundemental frequency ranging from 85 Hz to around 4 kHz. A bandpass filter could've attenuated frequencies below the 85 Hz, but to a negligible imporovement for our system at an unwelcome additional computational cost. Moreover, the microphones already filter some of the low frequencies.

I implemented the filter on our microcontroller in embedded C. I tested it using LabVIEW to check the filter frequency response and output given different stimuli (singal generator, then actual audio/sound). When integrating my filter with the rest of the onboard algorithms, I worked with my paired partner to optimize the entire onboard audio processing pipeline for improved real-time performance. In the end, the team finished an end-to-end system integrated into a 5-seater Mercedes S-class that correctly identified the loudest human speaking around 75% of the time.

  • Embedded C |
  • MATLAB |
  • LabView |
  • DSP |
  • embedded systems design

eBay Market Data Analysis

Ask the user what to search for like a normal eBay search query and request a few additional parameters like whether to look at past or current listings or only buy-it-now or auction.

Then build a specific URL using encodings learned from eBay API documentation. Use the Python Requests library to request access to the webpage by the server managing the webpage directed by the built URL.

Finally scrape every listing using the Python BeautifulSoup library and store the listings data (title, price, shipping, date, and URL) into a fresh CSV stored locally.

  • Python |
  • Requests |
  • BeautifulSoup |
  • eBay API

Enter search query (Logitech c920 -case -cable -cover), add parameters (BuyItNow/Auction/both, current/past, etc.), build URL, and store listings data (title, price, date, URL) in CSV

The user digs through archived scraped eBay listings CSVs and chooses which one to process. First it loads all of the listings from the CSV into a Pandas dataframe. Then it processes the data depending on whether the listings are currently live or completed.

If live, it computes logistics such as the current min, max, mode, and mean prices (+shipping) and stores them in a new CSV alongside its associated listings data.

If processing past listings, compute the same logistics, but since eBay only archives the past 90 days, compute the logistics by month and days of each month. The daily logistics are plotted in separate plots per month. Meanwhile monthly logistics are saved into a local CSV similar to the live listings logistics data.

  • Python |
  • Pandas

Process listings data (Logitech c920 webcam in this example) to compute min, max, mean, and mode

Linux Face Verification

First have the user type their name and the system will first check if that name is among those in the database of verified users. If not, the system restricts access to the specified file(s) using the Python OS module to invoke the Unix chmod command.

Otherwise, the system takes a live snapshot with a connected camera using OpenCV. If it can't detect a camera, the system exits.

After taking a snapshot, it builds Google's FaceNet model in Keras using Adam Optimization and a custom triplet loss function built in TensorFlow. Then the system loads pre-trained parameters found online onto the model to expedite its training.

With the model trained, the system builds a database of 128-point vector encodings by processing each verified user's image through the FaceNet model.

Finally, the system verifies the user by passing their taken image through the FaceNet model and computes the Euclidean distance (L2 norm) between its encoding and the associated encoding in the database. If the distance is below a threshold, the user is verified and the files become unlocked via chmod. Otherwise they get locked out.

  • Python |
  • TensorFlow |
  • Keras |
  • OpenCV |
  • Numpy |
  • OS

Initially the file (Test.py) is locked ("X" in file manager) and then unlocks after verifying the user against the image of the authorized user, a red Bubly can. Then the system rejects an invalid user (green Bubly) and re-locks the file.

Neural Style Transfer

Recreate an image (left: Golden Gate Bridge) in the artistic style of another image (right: Beautiful Dance by Leonid Afremov)

Computes an image using the content of one image and the style of another based on reaseach conducted by Gatys et al..

Starts by initializing an Nvidia GPU TensorFlow session using CUDA to accelerate the deep learning. If no GPU is detected, it defaults to using the CPU.

Then it loads two images. The first will be used as the content and the second as the style to be transferred. The images are loaded using OpenCV, which also reshapes and normalizes the image matrices to simplify computations. A noisy template is created using a Gaussian Filter applied to one of the images. This is the base of the resulting image.

The VGG-19 Convolutional Neural network was recreated in TensorFlow, without the top Fully-Connected Layers since I want to modify an image, not classify it. Thanks to MatConvNet Team, training the large VGG-19 was expedited by using their downloadable parameters pre-trained on a large training set from ImageNet.

The two normalized images are both forward propagated through the VGG-19 to compute their respective regression losses with respect to the noisy base image. However, since we're only interested in certain features of each image, they are only forward propagated through select layers.

Since earlier layers extract more concrete features, the content image is propagated through an early layer(s). Meanwhile, the style image is propagated through a series of deeper layers to extract the more abstract stylistic features. The two resulting costs are then combined and optionally denoised.

Finally, the base noisy image is propagated through the entire VGG-19 with the total cost and Adam Optimization for a number of iterations to produce a style transferred image.

It's important to note that results vary wildly based on a lot of configurable model and optimization hyperparameters including content and style layers and weights.

  • Python |
  • TensorFlow-GPU |
  • OpenCV |
  • Numpy |
  • CUDA

Starry Night Over the Rhone

Beautiful Dance

Portrait of Vincent Van Gogh

Slug-O-lympics

I worked with two other engineers to design and develop an autonomous drone that placed among the top 8 in the 24-team Slug-O-lympics competition. The objective was to serach for towers dispensing ping-pong balls, collect and store the balls, and locate at least two different targets to drop the balls into given a randomly configured bounded playing field. All this before an opposing drone without going out of bounds.

I led the mechanical body design and prototyping using Solidworks. The Solidworks drawings were then printed on MDF and cut using an on-campus laser-cutter. I heavily emphasized spending time on the design to reduce the number of iterations since we used our own money on materials and using the laser-cutter always took long.

Our drone was event-driven programmed using an events and services framework. An event is when a state change occurs in the state machine. A service is the response to an event. Similar to a priority scheduler, we poll for events, post them in a queue in order of priority, and execute the associated service routines.

I worked on the event checking and service routines since the drone had to respond (services) to changes in its sensor readings (events). We used numerous sensors from a bump switch for collision detection to a LC precision-frequency detection circuit we made to locate the ball loading towers. The services triggered our actuators, the wheels and servos, based on the varying combinations of sensor readings and current state machine state comprising an event.

  • Embedded C |
  • Solidworks |
  • sensor processing |
  • Event Driven Programming

Feel free to get in touch!

I am currently actively job searching and applying. Please don't hesitate to reach out! Even if you just want to say hello, I will try my best to get back to you as soon as I can! Thank you for your time and interest!