My problem is vibration from a mechanical source outside of my home. I think I have found the source (machinery at a legal marijuana grow op) and need to prove it to get an injunction at court.

I don't know if there is direct mechanical transmission (1 - 80 Hz) or if ground or air noise is causing my house to resonate (4 - 8 Hz). So I'm looking for a tool, probably an oscilloscope, to use with an industrial accelerometer to find direction to source. I'm also looking for a spectrum analyser to use with an infrasonic microscope to detect infrasonic noise and get a frequency signature.

How do I select a DSO/SA that has frequency response from 0 - 80 hz? My budget is very limited, as this is just a one time use.

If anyone has a better idea let me know!

  • \$\begingroup\$ I've seen some weird resonances in natural gas lines that cause rather irritating intermittent noise in a house. If that's the source you could monitor the gas lines with your instrument. \$\endgroup\$ Dec 26, 2014 at 10:23
  • \$\begingroup\$ A $35 Arduino Nano board and a USB cable could work as your DSO. The Nano v3 can sample 10 bits up to some kHz. It can send serial data at 115kbaud, so could easily write it out as fast as it samples it. Use a timer interrupt to trigger the sampling, to keep the jitter down. Watch out for electrical noise from the PC. Write some python to ingest and process the serial stream. \$\endgroup\$
    – tomnexus
    Dec 26, 2014 at 12:36
  • \$\begingroup\$ Curious, were you able to find a resolution to this and prove it was a specific location? \$\endgroup\$
    – crthompson
    May 10, 2019 at 16:39
  • \$\begingroup\$ I purchased software from Virtins that I can use to analyse recordings. I purchased two measurement microphones and put them on a one meter board. I record the noise, look at the recording on the spectrum analyser, bandpass filter to isolate a frequency and use the oscilloscope to find time difference for zero crossing at each microphone. The time difference can be used to figure out which microphone is closer and a compass can be used to get bearing to source. The grow op is closed due to change in regulations. \$\endgroup\$ May 11, 2019 at 21:25

2 Answers 2


An idea for low cost vibration monitoring: use your smartphone.

I did this recently out of curiosity. Found an app that records my phone accelerometer to a text file. Leaving the phone on a table, I could detect the vibration of a diesel generator in the office basement. The generator vibration was only just perceptible by a person, and the phone could just detect it after some post processing in Octave/Python/Matlab.

You could take measurements at a few places and plot them on a map to show the source of the vibration.

The phone records at up to 200 Samples/s, plenty for the vibration you're hunting. And the results are in m.s-2,so even if this isn't a traceable calibrated measurement, it gives you some figures to play with.

Edit: here's the result, from processing my smartphone accelerometer. The Android app is called Accelerometer Monitor, though there may be others. You can see the generator vibration, and the way it vanishes when the generator shuts down: generator vibration generator on and off

The code to plot this looks like this, works in Octave (free software), should also work in Matlab. I did need to remove the headers and footer from the text file.

windowsize = 1000;                             % samples in a window

A = dlmread('generator.txt',' ');              % load the cleaned-up file
B = detrend(A(200000:end-100,1:3),'linear');   % remove DC and drift
sb = size(B,1);                                % size of B
nw = floor(sb/wind);                           % number of windows in the file
dt = mean(A(:,4));                             % delta-t in ms
freq = linspace(0,500/dt,wind/2-1);            % frequency axis for plotting
tim = (1:(nw))*wind*dt/1000;                   % time axis for plotting

clear F
for a=1:nw
  temp = abs(fft(B(((a-1)*wind+1):(a*wind),:))).^2;
  F(:,:,a) = (( temp(2:(wind/2),:) + temp((wind):-1:(wind/2+2),:) )/wind);

pcolor(tim,freq,squeeze(10*log10(F(:,3,:)))); shading flat;
cax=caxis; caxis([cax(2)-25 cax(2)]); colormap(hot);
ylabel('Frequency, Hz'); xlabel('time, s');
title('Vibration measurement');

The code above is made more complicated than it needs to be, because I wanted a spectrogram. For a simple graph of the spectrum, just take the fft of a few seconds worth of data, like this:

A = dlmread('acceleration.txt',' ');  % load the data
F = fft(A(1:2000,3);   % choose a channel, Z had the most vibration for me
F = abs(F(2:1000))+abs(F(1999:-1:1001)); % add positive and negative frequency

Octave is available for Windows, free.

Edit: I neglected to mention in the code above, that the acceleration data from a smartphone isn't necessarily at even intervals in time. You might get away with it in a short spectrogram, but you really need to resample it before doing the DFT.

  • \$\begingroup\$ I have that application on a tablet. How do I convert the data to the graphs you are showing here? \$\endgroup\$ Dec 27, 2014 at 16:52

Since you are trying to do this cheaply, You might try making a directional microphone using a subwoofer speaker as the microphone element. article link for construction of a directional mic is here: This would allow you to point a directional microphone at the source. If you compared the audio captured by directional mic to one coupled to the building; that may help establish it as the source. Particularly if you pan the directional mic on a tripod and no other direction records a similar signal.

  • 1
    \$\begingroup\$ Unfortunately microphones can't easily be made directional for low frequencies. They would need to be a few wavelengths long, which for a 4-8 Hz signal is hundreds of metres. Finding this will need to be done mapping the strength of the signal, not finding the direction of it. \$\endgroup\$
    – tomnexus
    Dec 26, 2014 at 9:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.