Led the full experimental workflow for guitar modal and acoustic analysis under
Prof. Zhu Mao at WPI: configured impact hammer, modal shaker, accelerometers, and a
Laser Doppler Vibrometer to measure structural vibrational response across body
shapes, bracing, and tonewoods.
Read more
To understand how build quality affects acoustic quality, I bought guitars and
strings at different price points, including instruments with cracks and
deformities, and compared their frequency response functions and harmonic
profiles. Extracted natural frequencies, damping ratios, and mode shapes with a
Crystal Instruments DAQ and MATLAB (pwelch), the same vibro-acoustic techniques
used in speaker, enclosure, and instrument design.
View code
%% Impact test: normalized power spectrum across string price points%% === USER PARAMETERS ===
Fs = 40960;
noverlap = 0;
N_peaks_total = 10;
%% === INPUT FILE ===
file = 'time_force241.mat', 'time_force243.mat','time_force247.mat';
%% === Load ===
data = load('time_force241.mat');
window_size = 265728;
signal = data.(cell2mat(fieldnames(data)));
signal = signal(2, :); % force row
signal = signal(:); % column vector
[pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs);
figure;
[pks, locs] = max(pxx);
f(locs);
y1= semilogy((2*f/(f(locs))),pxx, 'LineWidth', 2, 'DisplayName','$', 'color', '#0F33E0');
xlabel('Peak (#)');
ylabel('Power/Frequency (dB/Hz)');
title('Bad Guitar, Nylon String, Low E note');
grid on;
xlim([0,10]);
hold on
%% === Load ===
data = load('time_force243.mat');
window_size = 236646;
signal = data.(cell2mat(fieldnames(data)));
signal = signal(2, :); % force row
signal = signal(:); % column vector
[pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs);
[pks, locs] = max(pxx);
f(locs);
y2= semilogy((2*f/(f(locs))),pxx, 'LineWidth', 1.5, 'DisplayName','$$', 'color', '#FFEA00');
grid on;
xlim([0,10]);
%% === Load ===
data = load('time_force247.mat');
window_size = 236646;
signal = data.(cell2mat(fieldnames(data)));
signal = signal(2, :); % force row
signal = signal(:); % column vector
[pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs);
[pks, locs] = max(pxx);
f(locs);
y3= semilogy((f/(f(locs))),pxx, 'LineWidth', 1, 'DisplayName','$$$', 'color', '#FF1901');
grid on;
xlim([0,10]);
hold off
legend([y1 y2 y3],'$', '$$', '$$$');
View code
%% LDV scan: FRF magnitude with coherence overlaymodal_data_good = readuff('Scan_modal_good_guitar_0721.uff');
figure;
plot(modal_data{66}.x, abs(modal_data{66}.measData));
xlabel('Frequency (Hz)'); ylabel('Magnitude (mm/s^2/N)');
title('LDV Testing w/ Shaker on Good Guitar Body');
yyaxis right
plot(modal_data{221}.x, abs(modal_data{221}.measData));
ylabel('Coherence'); ylim([0.55 1]);