This project investigates whether guitar price and build quality measurably
affect acoustic performance, or whether perceived differences in tone owe more
to construction and materials than to cost. Rather than relying on how the
instruments sounded by ear, we approached the question from a dynamic
standpoint, a more objective, measurable basis for comparison. I tested three
guitars and six strings across a range of price points, build quality, and
visible deformities, comparing frequency response and harmonic content to see
what the data actually showed.
Read more
I 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.
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. I 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.
The results showed that guitar body quality, size, material, and construction
had a far greater influence on acoustic performance than string price.
Differences between strings of the same material were subtle and often
negligible.
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]);