Where is my mistake in this MATLAB code?

Click For Summary

Discussion Overview

The discussion revolves around troubleshooting MATLAB code used to plot data related to acoustic noise products as described in a referenced paper. Participants explore potential issues with the code, particularly concerning logarithmic calculations and frequency ranges, while comparing results with expected outcomes from the paper.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • Some participants express concern about the possibility of encountering log(0) errors in MATLAB and how this might affect the results.
  • One participant notes that their implementation in Mathcad aligns well with the expected plot, suggesting an offset of about 45 dB might be present.
  • There is a question regarding the frequency range used in the plot, with suggestions to refine the frequency vector for better accuracy.
  • Some participants discuss the difference between logarithm types in MATLAB and Mathcad, indicating that using natural logarithm in MATLAB could lead to different plot shapes.
  • It is suggested that the normalizing constant A_0 contributes to the observed dB offset, and that the frequency range should be adjusted to capture low frequencies more accurately.
  • One participant mentions that for d=5 km, the curves are similar except for a scaling factor, while for d=100 km, there is a significant difference, questioning if this is also due to A_0.
  • Another participant confirms that their results at d=100 km match the paper's figure shape, again noting the offset issue.

Areas of Agreement / Disagreement

Participants generally agree that the code has no fundamental issues but highlight the importance of the normalizing constant A_0 and the frequency range used. There is no consensus on the exact reasons for discrepancies at different distances, particularly at d=100 km, indicating ongoing uncertainty.

Contextual Notes

Limitations include potential issues with plotting at integer frequency values, which may not provide a comprehensive view of the data, and the undefined behavior of the logarithmic function at zero frequency.

EngWiPy
Messages
1,361
Reaction score
61
Hi,

I am trying to plot the AN product sec II.C in the attached paper as:

Code:
clear all
clc

s=0.5;
w=0;
d=5; 

f=0:20;

NdB1=(17-30.*log10(f));
N1=10.^(NdB1./10);
NdB2=40+20*(s-0.5)+26.*log10(f)-60.*log10(f+0.03);
N2=10.^(NdB2./10);
NdB3=50+7.5*w^0.5+20.*log10(f)-40.*log10(f+0.4);
N3=10.^(NdB3./10);
NdB4=-15+20.*log10(f);
N4=10.^(NdB4./10);

N=N1+N2+N3+N4;

adB=0.11.*((f).^2./(1+(f).^2))+44.*((f).^2./(4100+(f).^2))+2.75*10^-4.*(f).^2+0.003;
a=10.^(adB./10);

A=(d^(1.5)).*a.^d;
A_N=1./(A.*N);
 
A_NdB=10*log10(A_N);
 
plot(f,A_NdB)

The details of these equations are highlighted in the attached file.

I appreciate if someone points to me my mistake, and the figure should be like Fig 3

Thanks
 

Attachments

Physics news on Phys.org
What problem are you seeing? I'm not that familiar with Matlab, but one potential problem is trying to take log(0) ... how does Matlab handle this (eg, error, NaN)?

I've implemented your equations in Mathcad and the shape of the resultant plot seems to agree with the document's plot, seemingly differing by an offset and/or scaling factor - the peaks seem to agree and the overall size looks OK, so I suspect an offset of about 45 dB.

attachment.php?attachmentid=52389&stc=1&d=1351440442.jpg
 

Attachments

  • phys - 12 10 27 acoustic underwater comms 01.jpg
    phys - 12 10 27 acoustic underwater comms 01.jpg
    48.9 KB · Views: 682
What is the f range in your plot? Can you post your code please?
 
S_David said:
What is the f range in your plot? Can you post your code please?

I'm (hopefully) plotting the same range as you, on the assumption that your code was specialized for kHz. Here's an image of the (attached) Mathcad code.

attachment.php?attachmentid=52395&stc=1&d=1351445528.jpg
 

Attachments

Are you using log10 or natural logarithm in your code?

It looks like very much the same as my code!
 
Yes, it does look pretty much like your code, so that's why I was wondering what problem you're seeing.

Mathcad's "log" is log10 by default; Mathcad uses "ln" for loge. Whereas, it seems, Matlab's "log" is loge. Using loge results in plots that look markedly different from the article's plots - far more peaky.
 
S_David said:
Are you using log10 or natural logarithm in your code?

It looks like very much the same as my code!

There's no real problem with your code, it's just the normalizing constant A_0 causing the dB offset. That and the fact that you are plotting at too few values of "f", especially at low frequencies, to get a very accurate picture of what's going on.

Just replace the line

"f = 0:20"

with

"f=[0.1 : 0.1 : 20]" (or even better with f = logspace(-1,log10(20),100)

and you'll get exactly the same graph as figure 3 in the paper (k=1.5, w=0, s = 0.5 and d=5km), except for about a 45 dB offset, presumably due to A0.

BTW. You could have made it a lot easier for people to see what your problem was if you had of actually described the errors or anomalies you were concerned about (or even better posted an image of the plot you were obtaining).
 
Last edited:
uart said:
There's no real problem with your code, it's just the normalizing constant A_0 causing the dB offset. That and the fact that you are plotting at too few values of "f", especially at low frequencies, to get a very accurate picture of what's going on.

Just replace the line

"f = 0:20"

with

"f=[0.1 : 0.1 : 20]" (or even better with f = logspace(-1,log10(20),100)

and you'll get exactly the same graph as figure 3 in the paper (k=1.5, w=0, s = 0.5 and d=5km), except for about a 45 dB offset, presumably due to A0.

BTW. You could have made it a lot easier for people to see what your problem was if you had of actually described the errors or anomalies you were concerned about (or even better posted an image of the plot you were obtaining).

I am sorry if I were not clear, and thanks for your reply.

For d=5 Km the curves are very similar except for a certain scale, but for d=100 Km there is a huge difference! Is that because of A0, too?

Thanks
 
S_David said:
I am sorry if I were not clear, and thanks for your reply.

For d=5 Km the curves are very similar except for a certain scale, but for d=100 Km there is a huge difference! Is that because of A0, too?

Thanks
Ok I don't know, I only checked the code you posted and it gave the correct results (except for the offset) for d=5. The paper refers to a normalizing constant A0, which is not included in your equations, so certainly that could account for the dB offset. The other problem was that the result is -inf dB at f=0, so that result wasn't being shown on the graph, and plotting at just the integer frequencies 1:20 was not enough to get a good picture of the graph.
 
  • #10
Ok I just checked the result at d=100 and it also agrees exactly with the graph (fig3) in the paper (except for the offset due to whatever normalizing constant they're using).

For d=100 I used the freq range: f = logspace(-2, log10(7), 100) to reproduce the figure in the paper (same shape exactly, but again with an offset of about 45 dB).
 
  • #11
uart said:
Ok I just checked the result at d=100 and it also agrees exactly with the graph (fig3) in the paper (except for the offset due to whatever normalizing constant they're using).

For d=100 I used the freq range: f = logspace(-2, log10(7), 100) to reproduce the figure in the paper (same shape exactly, but again with an offset of about 45 dB).

Thank you so much, it is working now. Just the scaling factor is different which is of minor importance.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 3 ·
Replies
3
Views
4K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 41 ·
2
Replies
41
Views
10K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 5 ·
Replies
5
Views
2K