Reverberation time and Sound analysis of rooms using Python

Tomasz Trzos
01 November 2018
8 min read

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?

Read a wav file to measure reverberation time

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

Visualisation of a sound: amplitude of a digital signal

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

Visualisation of a sound: a spectrogram

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: Decibel values for a specific frequency

Sound Analysis Python


Sound Analysis Reverberation Time

The reverberation time of the room

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

  • green oval: max
  • yellow oval: max - 5dB
  • red oval: max - 25dB
     

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.

Linear regression

Reverberation Time Python Linear Regression


Reverberation Time Linear Regression Graph

An improved algorithm to calculate a reverberation time of room

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 

You may also like...

Development

How different is Python from JavaScript?

This is a question I asked myself a few weeks back. I am a JavaScript developer by trade and have recently ventured into...

Aleksandra Borowska
09 July 2021
5 min read
Startups

How to create a winning go-to-market strategy for your startup

Congratulations, you’ve just come up with an awesome startup idea that’s going to change the world! And afte...

Mateusz Łozowicki
01 July 2021
6 min read