Finding the closest match for data.

10 views (last 30 days)
Leon Ellis
Leon Ellis on 15 Nov 2021
Answered: Brahmadev on 12 Apr 2024 at 11:27
Good day, here I've plotted a power, frequency vs time domain of an audio signal.
I have the power, frequency and time values requered to plot this graph. I want to compare words to one another and comput the closest match. I'm thinking of using the mean square error (MSE) using the immse() function, however I'm not sure if that will give me the result I require. If I make a nx3 matrix (with n being many numbers) using horzcat(p,t,f) function to concatenate the power, time and frequency; will I be able to obtain an accurate difference using the immse() function to compare 2 arrays of size nx3? Or would a different approuch be needed to compare them and obtain more accurate results? Thanks in advance!

Answers (1)

Brahmadev
Brahmadev on 12 Apr 2024 at 11:27
The strategy that you have described using "immse" function can be useful for comparison. Some other things to consider are:
  1. Does the data need to be pre-processed and normalized?
  2. Are the time and frequency ranges identical and can they be ignored for the comparison?
For comparing images or 2D matrices, you can also use "psnr" or "ssim". Refer to the example below for usage of "ssim", I have taken some example data with different time and frequency. Interpolation can be ignored if the ranges are identical.
% Dataset 1
frequency1 = linspace(0, 400, 100); % 100 points from 0 to 400
time1 = linspace(0, 0.5, 50); % 50 points from 0 to 0.5
[FreqGrid1, TimeGrid1] = meshgrid(frequency1, time1);
Power1 = sin(FreqGrid1 / 100.0) .* cos(TimeGrid1 * 4 * pi);
% Dataset 2 with different ranges
frequency2 = linspace(0, 500, 120); % Different range and number of points
time2 = linspace(0, 0.6, 60); % Different range and number of points
[FreqGrid2, TimeGrid2] = meshgrid(frequency2, time2);
Power2 = sin(FreqGrid2 / 120.0) .* cos((TimeGrid2 * 5 * pi) + pi / 8);
% Interpolate Dataset 2 to match the grid of Dataset 1
Power2Interpolated = interp2(FreqGrid2, TimeGrid2, Power2, FreqGrid1, TimeGrid1, 'linear');
% Calculate SSIM between the original Power1 and the interpolated Power2
[ssimval, ssimmap] = ssim(Power1, Power2Interpolated);
fprintf('The SSIM value is %0.4f\n', ssimval);
% Optionally, visualize the SSIM map
figure;
imshow(ssimmap, []);
title(sprintf('SSIM Index Map - Mean SSIM Value: %0.4f', ssimval));
You can refer to the following documentation link for more information:
  1. https://www.mathworks.com/help/images/ref/ssim.html
  2. https://www.mathworks.com/help/images/ref/psnr.html
Hope this helps!

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!