Professional Software Development Outsourcing
Not all companies have the luxury of owning an in-house tech team. That is to say, the luxury of having a skilled team they can consult when looking to achieve tech-related business goal...
Have you ever thought that as a web developer you would have to deal with sound analysis? Neither have I but I faced it during a project for a company which is the leading Polish acoustic furniture producer. The case was a web app with a solution to record sound, analyse it and calculate reverberation time using Python. It sounds like a nightmare for a programmer without specific knowledge about sound and acoustics, doesn't it? Fortunately, a lot of Python libraries which come in handy!
So let me walk you through the whole process. Would you like to learn how to analyse sound?
First of all, you have to read a wav file and find out some details from it. In Python it is a simple task because you only need a library called the SciPy, which is quite extensive. But let's focus only on the package scipy.io.wavfile. You can download a sample sound file with a strong signal (which is used to measure reverberation time) to compare your results with mine: download (watch out for level of your volume).
Calculate Reverberation Time Python
The method above returns two variables: sample rate of wav file and data (an array containing numbers). The numbers can have different ranges and types depending on the different types of wav formats.
Reverberation Time Python
In our case, we have an int16 NumPy dtype that is simple to check. Let's see what we can read from our file.
Visualization of a Sound
What can you do with such data? You can use another interesting library that is widely used for visualising any kind of data and preparing different kinds of charts: matplotlib. What we want to achieve is a chart that shows us a waveform of a digital signal. You can compare your result with a chart I generated using an audio editor called Audacity.
Visualizing a sound
You have your sound data in a range from -2^15 to 2^15-1 so we can simply scale it to values in a range from -1 to 1 by dividing all the values by 2^15. Then you have to prepare a time array whose length will be the same as the array with our sound data. For that case, you should use a NumPy library, which helps a lot with calculations on arrays. The next step is to use a plot function from matplotlib and, voilá, we have a finished chart.
Sound Visualization Chart
To calculate a reverberation time you need a level of dB in a particular time. You can try to write a code step by step, but I used a specgram method from matplotlib which returns me everything I need. Let's focus on how to get a spectrogram and in the next part, we will go to reverberation time. As in the previous example, you can compare your result with a spectrogram from Audacity.
Reverberation Time Spectrogram
Calculate Reverberation Time
I won't analyse a parameter for the specgram function, but if you want to read more about it I encourage you to check the documentation of matplotlib.pyplot.specgram. Let’s see what this function returns.
Reverberation Time Specgram
Source: https://matplotlib.org/api/_as_gen/matplotlib.pyplot.specgram.html
Sound Analysis Python
Sound Analysis Reverberation Time
We should be conscious that reverberation time is an important issue because it's really inconvenient to stay in a room where it is too high. Now you will be able to check it yourself following these steps:
1. Find a maximum value of dB's in our array
2. Slice data and time arrays to the point where you found a maximum value
3. Find a value which will be equal to max-5dB
4. Slice the data and time arrays to the point where you found a max-5dB
5. Find a value that will be equal to max-25dB
6. Calculate the time which takes amplitude to drop from max less 5dB to max less 25dB (RT20)
7. Multiply your time by 3 which gives you a RT60
Does it sound a bit tricky and hard to understand? Let's have a look at the code below.
Reverberation Time Python
Reverberation Time Graph
Now you have an algorithm that works on a raw signal. To improve our results we should calculate a reverberation time on data, which was normalized in some way. The best choice for that problem is a linear regression.
Reverberation Time Python Linear Regression
Reverberation Time Linear Regression Graph
The following step is changing your algorithm to calculate the same way as before but on linear regression. Let's look at the code below. You almost finished!
Calculate Reverberation Time Linear Regression
Ok, that’s it! You just wrote a script which allows you to check reverberation time in your room. The solution in this article was a bit simplified compared to the solution in the project for our client, but it is enough for checking reverberation time in your own room. Python libraries give us a possibility to deal with unusual use cases which would be more difficult to implement e.g. in Ruby.
Any comment you want to share with us? Drop us a line: hello@start-up.house.