In this instructable, we will be building an intelligent hearing aid. The goal is to build a low power, cost-effective hearing aid that has several key intelligent features. First, it has tuning functionality that allows the wearer to tune the amplification to his or her needs. It has a conversational mode which recognizes voice input and amplifies it while reducing background noise. It saves all data to memory so that the device can be quickly powered up and ready to use. This device also has a very easy user interface to keep operation quick and simple.
The block diagram above outlines how the hearing aid works. A signal picked up by the microphone first goes through a pre-amp stage which culls frequencies above 3kHz (outside hearing spectrum) and then amplifies the remaining signal for future stages. The signal then progresses to the filter stage where it goes through four parallel filters that divide the signal into four frequency ranges. This filtered signal is read by the level estimator and provided to the Arduino. The filtered signal is also passed to the gain-controlled stage where the signals are amplified based on tuning settings provided by the Arduino. The signal finally enters the output stage where it passes through a summer and the modified signal can be heard with a pair of earphones.
Step 1: Design
The circuit for the hearing aid must accomplish several key tasks. First it has to amplify the microphone signal to a large enough level to be processed by the rest of the circuit. Next the signal has to be passed through a set of filters to split up the signal into four audio bands to be level estimated and then individually scaled. Finally the bands must be recombined and sent to a pair of headphones. The Arduino reads the levels of each band and scales the bands appropriately.
This project requires about $60 worth of parts. See cost table above. Please refer to the parts list attached for a full list.
Step 2: Power Supply
The entire system operates at several different voltages. The preamplifier, Arduino, and filtering circuitry all operate off of 3.3V which is generated using a low dropout regulator (LT1120). As for the digital op amps and summing output amplifier, they run off the unregulated supply (3.6V when connected to a LiPo or 5V if powered through USB). This design has the advantage of minimizing noise in the preamplifier and filtering stages since transients are regulated away and we don’t have to worry about the battery’s voltage lowering over time.
The next most important voltage in the system is virtual ground. This is set to be half of 3.3V (1.65V) and is generated using an op-amp follower hooked up to a voltage divider. This signal is the reference point for all analog signals. Care must be taken to minimize any noise on this line because otherwise that noise will propagate through the entire system. Finally, all of the power inputs of the ICs are bypassed to minimize power supply noise.
Step 3: Preamplifier
The preamplifier circuit is used to amplify the electret microphone signal to an appreciable level. To do this, it uses a pair of non-inverting AC amplifiers to amplify the electret microphone 100x. The microphone signal is first AC-coupled with virtual ground and then passed into the rest of the preamp. The amplifiers each have a gain of 10x and are AC coupled. By using this configuration, we only amplify the AC signal and maintain the same DC offset. This prevents the propagation of DC offset errors in a single supply amplifier.
Along with the preamplifier, there is also an attenuator for the tuning signal sent from the Arduino. This lowers the signal to a comparable level from the microphone through a voltage divider and an inverting op amp with a gain of 1/10. The outputs of these amplifiers are fed into a toggle switch which is used to switch between the tuning signal and the microphone signal for when you enter tuning mode.
Step 4: Filters
Since this is an audio device, it is important to ensure that the outputs of the filters remain in phase. Since Bessel filters have the flattest group delay, they are the filter of choice for this design. We will also be using Sallen-Key topologies to implement these filters as we can build a second order filter with a single op amp. For the bandpass filters, we will be using a VCVS topology.
The signal for this design is split into four channels, corresponding to four different bands important to hearing. The first band consists of signals below 300Hz, so we use a standard low pass filter. This band corresponds to low frequencies that can be heard. The second band starts at 300Hz and continues to 3kHz. This band is selected to correspond to the voice range. The third band begins at 3kHz and extends to 8kHz. This corresponds to high frequencies that can still be heard. Finally, the fourth band extends beyond 8kHz.
The filter specifications in the schematic above are recommended for operation. If you would like to change the bands for your own needs, component values will have to be changed. If you are unfamiliar with the Sallen-Key topology, please read through this as it will guide you through the calculation. If you wish to change the bandpass filters, this is a useful tool to guide you through the process. Please note that the Q-factor for a Bessel filter is 1/sqrt(3). Please refer to this for Q-factors of other recommended filters.
Step 5: Level Estimator
For the hearing aid, we want to be able to estimate the power in each frequency band. The popular way to do this is through an FFT. However, while this is possible with an Arduino, it would be taxing on it’s resources. So instead we use a level estimator at the end of the separated bands to mimic the function of an FFT in analog circuitry.
To estimate the level of each band, we rectify the signal using a Schottky diode and then charge a capacitor to save the level information. The capacitor is in parallel with a resistor which is used to slowly discharge it, creating an averaging effect. This signal is then fed into an analog input of the Arduino which can use it to detect the level of the band.
Note: Image courtesy of Bucknell University
Step 6: Arduino
The Arduino serves as the control center for this project. The Arduino receives analog inputs from the level estimators and receives inputs from the push buttons. The Arduino provides digital outputs to the gain-controlled op amps and outputs the tone during the tuning phase. Please also remember to hook up the pushbutton as the main schematic dictates before starting this section, as the pushbuttons are used for system control. If you would like to use the Arduino code as it is currently provided, an Arduino Mega is required and inputs and outputs have to be wired exactly as in the schematic above. Users of the Arduino Uno will have to change pin numbers in the code. Please note that the current threshold setpoints have also been determined for a 5V input, so if you are using the 3.3V battery supply, these thresholds will have to be altered.
The first function the Arduino provides is tuning. On startup or reset, the Arduino polls both pushbuttons for one second waiting for a hit. If a button is pushed, the Arduino moves into the tuning state. It then proceeds to play four tones, one tone for each band. If the user presses pushbutton one, the gain is doubled. If the user presses pushbutton two, the next band is tested. Once the tuning is complete, the gains are recorded to EEPROM. Please note that during tuning, the digital op amps that are not being tuned have their gains set at zero so only the specific band passes. If you choose to alter the code, ensure that you always remember to read in the EEPROM values after tuning.
The second function of the Arduino is a conversational mode. Once pushbutton two is pressed, the Arduino enters the conversational mode where voices are amplified and background noise is attenuated. The Arduino uses a time averaged reading of the low-mid passband to determine whether a voice is present. If this time averaged value is greater than background noise, it will increase the gain of the low-mid band and decrease the gain of the other bands to a minimum of unity gain. The LED at pin 13 will also light up when this boosted gain mode is entered. Note that the Arduino has a five second relaxation time so it will stay in the boosted gain mode for five seconds until it switches back to normal when no voices are present. Hysteresis is also present to prevent jittering. Pressing button two again transitions out of this mode and locks the gain values to tuned values until button two is pressed again.
Please note that the Arduino begins by reading a test byte from EEPROM to determine if the data in the EEPROM is valid. If it is, it reads the values into the cache. Otherwise, all op amps are set to unity gain. Therefore, when you first load the code, it is recommended that you tune the device right away as the unity gains are not conducive to people with hearing loss.
Step 7: Amplification and Output
The filtered signals are then passed to digitally-controlled op amps. These were selected so that the gain could be actively changed to respond to the tuned needs of the wearer as well as the variability of the incoming signals. The op amps receive a three-bit signal from the Arduino corresponding to a gain setting. The signal is amplified and then passed to the summing amplifier. The summing amplifier simply sums the four signals at unity gain. If the signal seems attenuated, raising the gain here is a possibility. Refer to this to calculate new values. The output is connected to the female microphone jack that serves as the final output of the system.
Step 8: Results
Congratulations! You have successfully completed your hearing aid. Our design currently consumes 110mA and thus will last roughly 5 hours on a standard 3.3V LiPo battery. If you would like to extend this battery life, we recommend replacing the LT1632 op amps as they require a significant amount of power. Ensure that your new op amps can be powered by your supply and that they are rail-to-rail. We also recommend designing a peak detector circuit (like this) that can be hooked up to the interrupt pin of the Arduino. This will allow for power to be cut from the Arduino when amplification is not required due to a lack of audible signals.
If you would like to make your hearing aid even more intelligent, we recommend rewriting the gain boosting code for the Arduino. A smarter approach is to take the total power of the signal as read by the Arduino and redistribute it across the bands with a higher weighting on the speech band and lower weightings as you increase in frequency. The MATLAB model attached is a great starting place to experiment with. This will result in more realistic “focusing” on a person’s speech. Good luck!