Ripple Sounds
Introduction
%todo
FFT-iFFT method
Below is an example of an implementation in matlab. It is based on a broadband signal consisting of pink noise. The input parameters are
- t = time domain array
- octaves = frequency domain array
- ripples_per_sec = the ripple velocity
- phi = a phase that can be added to the time modulation
- ripples_per_octave = the ripple density
- ripple_type = determines if the ripple is ascending or descending
- modulation_depth = half the amplitude of the modulation
% Generate array with pink noise
pink_noise = pinknoise(n);
% Create modulation functions for time domain (velocity modulation)
time_modulation_sin = sin(2 * pi * ripples_per_sec * t + phi);
time_modulation_cos = cos(2 * pi * ripples_per_sec * t + phi);
% Create modulation functions for frequency domain (density modulation)
freq_modulation_sin = sin(2 * pi * ripples_per_octave * octaves);
freq_modulation_cos = cos(2 * pi * ripples_per_octave * octaves);
% Mirror the frequency modulation components for IFFT compatibility
mirrored_freq_mod_sin = [freq_modulation_sin, fliplr(freq_modulation_sin)];
mirrored_freq_mod_cos = [freq_modulation_cos, fliplr(freq_modulation_cos)];
% Apply time modulation to pink noise
modulated_noise_sin_time = time_modulation_sin .* pink_noise;
modulated_noise_cos_time = time_modulation_cos .* pink_noise;
% Perform FFT
fft_sin_modulated_noise_time = fft(modulated_noise_sin_time);
fft_cos_modulated_noise_time = fft(modulated_noise_cos_time);
% Apply frequency modulation
fft_modulated_noise_sin_time_freq = mirrored_freq_mod_sin .* fft_sin_modulated_noise_time;
fft_modulated_noise_cos_time_freq = mirrored_freq_mod_cos .* fft_cos_modulated_noise_time;
% Perform IFFT to get rippled noise in the time domain
sin_rippled_noise = ifft(fft_modulated_noise_sin_time_freq, 'symmetric');
cos_rippled_noise = ifft(fft_modulated_noise_cos_time_freq, 'symmetric');
% Determine the ripple type (ascending vs. descending)
switch ripple_type
case 'ascending'
combined_rippled_noise = sin_rippled_noise + cos_rippled_noise;
case 'descending'
combined_rippled_noise = sin_rippled_noise - cos_rippled_noise;
end
% Calculate the final modulated stimulus
rippled_stimulus = pink_noise + modulation_depth * combined_rippled_noise;
N.B. when the density is zero 'rippled_noise' by itself has an envelope of a rectified sine wave (which has double the velocity). Only after adding the original noise the envelope is the correct one.
Band filter method
%todo