[Scilab-users] Simulating phase modulation

classic Classic list List threaded Threaded
5 messages Options
Claus Futtrup Claus Futtrup
Reply | Threaded
Open this post in threaded view
|

[Scilab-users] Simulating phase modulation

Hi there

In a loudspeaker the driver can move several millimeter in an attempt to reproduce a low-frequency note. If the speaker also at the same time produce a higher tone, this second tone is phase modulated by the first one. This is a distortion of the original signal which I'd like to simulate / illustrate with some simple Scilab code, if possible.

In Matlab this can be simulated with pmmod.

Is there a similar function in Scilab? (name - please ?)

Here's the code I have written so far - this is the part that shows the input signal (the un-distorted signal):

sample_rate=20000;
t = 0:1/sample_rate:0.6;
N=size(t,'*'); //number of samples
y1 = sin(2*%pi*50*t);
y2 = 0.5*sin(2*%pi*500*t);
// y2 = 0.5*sin(2*%pi*500*t+%pi/4);
s=y1+y2+grand(1,N,'nor',0,1);

// Plot time-domain
endplot = round(N/15);
twoplots = scf(); // Set Current Figure (Graphics Window)
subplot(211);
plot(t(1:endplot),y1(1:endplot),t(1:endplot),y2(1:endplot));
subplot(212);
plot(t(1:endplot),y1(1:endplot)+y2(1:endplot));

y=fft(s);
ymax = max(abs(y));
y = y ./ ymax; // Normalize

// s is real so the fft response is conjugate symmetric
// and we retain only the first N/2 points
f=sample_rate*(0:(N/2))/N; //associated frequency vector
n=size(f,'*');
fftplots = scf();
plot(f(2:$),abs(y(2:n))); // drop first datapoint, f = 0 (it prevents log-plot)
a = gca();
a.log_flags = "lnn";

Best regards,
Claus

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Rafael Guerra Rafael Guerra
Reply | Threaded
Open this post in threaded view
|

Re: Simulating phase modulation

Hi Claus,

 

I am not aware of such function. However, you can find simple code here below for both phase modulation and demodulation, which is straightforward to translate in Scilab:

https://www.gaussianwaves.com/2017/06/phase-demodulation-using-hilbert-transform-application-of-analytic-signal/

 

Note that the phase modulation is coded differently from you snippet below.

 

Regards,

Rafael

 

From: users [mailto:[hidden email]] On Behalf Of Claus Futtrup
Sent: Friday, May 25, 2018 7:17 PM
To: International users mailing list for Scilab. <[hidden email]>
Subject: [Scilab-users] Simulating phase modulation

 

Hi there

 

In a loudspeaker the driver can move several millimeter in an attempt to reproduce a low-frequency note. If the speaker also at the same time produce a higher tone, this second tone is phase modulated by the first one. This is a distortion of the original signal which I'd like to simulate / illustrate with some simple Scilab code, if possible.

 

In Matlab this can be simulated with pmmod.

 

Is there a similar function in Scilab? (name - please ?)

 

Here's the code I have written so far - this is the part that shows the input signal (the un-distorted signal):

 

sample_rate=20000;
t = 0:1/sample_rate:0.6;
N=size(t,'*'); //number of samples
y1 = sin(2*%pi*50*t);
y2 = 0.5*sin(2*%pi*500*t);
// y2 = 0.5*sin(2*%pi*500*t+%pi/4);
s=y1+y2+grand(1,N,'nor',0,1);
 
// Plot time-domain
endplot = round(N/15);
twoplots = scf(); // Set Current Figure (Graphics Window)
subplot(211);
plot(t(1:endplot),y1(1:endplot),t(1:endplot),y2(1:endplot));
subplot(212);
plot(t(1:endplot),y1(1:endplot)+y2(1:endplot));
 
y=fft(s);
ymax = max(abs(y));
y = y ./ ymax; // Normalize
 
// s is real so the fft response is conjugate symmetric
// and we retain only the first N/2 points
f=sample_rate*(0:(N/2))/N; //associated frequency vector
n=size(f,'*');
fftplots = scf();
plot(f(2:$),abs(y(2:n))); // drop first datapoint, f = 0 (it prevents log-plot)
a = gca();
a.log_flags = "lnn";

 

Best regards,

Claus


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Claus Futtrup Claus Futtrup
Reply | Threaded
Open this post in threaded view
|

Re: Simulating phase modulation

Hi Rafael

Thank you, I shall print and study. :-)

Cheers,
Claus

On Fri, May 25, 2018 at 8:42 PM Rafael Guerra <[hidden email]> wrote:

Hi Claus,

 

I am not aware of such function. However, you can find simple code here below for both phase modulation and demodulation, which is straightforward to translate in Scilab:

https://www.gaussianwaves.com/2017/06/phase-demodulation-using-hilbert-transform-application-of-analytic-signal/

 

Note that the phase modulation is coded differently from you snippet below.

 

Regards,

Rafael

 

From: users [mailto:[hidden email]] On Behalf Of Claus Futtrup
Sent: Friday, May 25, 2018 7:17 PM
To: International users mailing list for Scilab. <[hidden email]>
Subject: [Scilab-users] Simulating phase modulation

 

Hi there

 

In a loudspeaker the driver can move several millimeter in an attempt to reproduce a low-frequency note. If the speaker also at the same time produce a higher tone, this second tone is phase modulated by the first one. This is a distortion of the original signal which I'd like to simulate / illustrate with some simple Scilab code, if possible.

 

In Matlab this can be simulated with pmmod.

 

Is there a similar function in Scilab? (name - please ?)

 

Here's the code I have written so far - this is the part that shows the input signal (the un-distorted signal):

 

sample_rate=20000;
t = 0:1/sample_rate:0.6;
N=size(t,'*'); //number of samples
y1 = sin(2*%pi*50*t);
y2 = 0.5*sin(2*%pi*500*t);
// y2 = 0.5*sin(2*%pi*500*t+%pi/4);
s=y1+y2+grand(1,N,'nor',0,1);
 
// Plot time-domain
endplot = round(N/15);
twoplots = scf(); // Set Current Figure (Graphics Window)
subplot(211);
plot(t(1:endplot),y1(1:endplot),t(1:endplot),y2(1:endplot));
subplot(212);
plot(t(1:endplot),y1(1:endplot)+y2(1:endplot));
 
y=fft(s);
ymax = max(abs(y));
y = y ./ ymax; // Normalize
 
// s is real so the fft response is conjugate symmetric
// and we retain only the first N/2 points
f=sample_rate*(0:(N/2))/N; //associated frequency vector
n=size(f,'*');
fftplots = scf();
plot(f(2:$),abs(y(2:n))); // drop first datapoint, f = 0 (it prevents log-plot)
a = gca();
a.log_flags = "lnn";

 

Best regards,

Claus

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Gary Nelson-2 Gary Nelson-2
Reply | Threaded
Open this post in threaded view
|

Re: Simulating phase modulation

Claus,

Back in the late 60s, I did my PhD research using analytic signal. Yes,it works, and the implementation details are more complex that we find on the link. A few years ago, I implemented a system for analyzing harbor porpoise vocalizations using scilab. For example, instantaneous phase(t) wants to be differentiable if instantaneous frequency is to be positive. I found that octave bands are the widest that preserves this feature. Yes, you can calculate phase(t) = atan(imaginary/real), but you have to add 2PI when atan wraps around in order to make phase monotonically increase.

 

Also, I am not convinced that a loudspeaker does phase modulation.  Certainly, if the speaker is linear, then superposition applies. If phase modulation occurs, it is a non-linear effect. Perhaps that effect is real, but we need to see a model to show how it comes to be.

 

I might be able to help you write analytic signal  code.

 

Good wishes

Gary Nelson

 

 

Sent from my Windows 10 phone

 

From: [hidden email]
Sent: Saturday, May 26, 2018 7:41 AM
To: [hidden email]
Subject: Re: [Scilab-users] Simulating phase modulation

 

Hi Rafael

 

Thank you, I shall print and study. :-)

 

Cheers,

Claus

 

On Fri, May 25, 2018 at 8:42 PM Rafael Guerra <[hidden email]> wrote:

Hi Claus,

 

I am not aware of such function. However, you can find simple code here below for both phase modulation and demodulation, which is straightforward to translate in Scilab:

https://www.gaussianwaves.com/2017/06/phase-demodulation-using-hilbert-transform-application-of-analytic-signal/

 

Note that the phase modulation is coded differently from you snippet below.

 

Regards,

Rafael

 

From: users [mailto:[hidden email]] On Behalf Of Claus Futtrup
Sent: Friday, May 25, 2018 7:17 PM
To: International users mailing list for Scilab. <[hidden email]>
Subject: [Scilab-users] Simulating phase modulation

 

Hi there

 

In a loudspeaker the driver can move several millimeter in an attempt to reproduce a low-frequency note. If the speaker also at the same time produce a higher tone, this second tone is phase modulated by the first one. This is a distortion of the original signal which I'd like to simulate / illustrate with some simple Scilab code, if possible.

 

In Matlab this can be simulated with pmmod.

 

Is there a similar function in Scilab? (name - please ?)

 

Here's the code I have written so far - this is the part that shows the input signal (the un-distorted signal):

 

sample_rate=20000;
t = 0:1/sample_rate:0.6;
N=size(t,'*'); //number of samples
y1 = sin(2*%pi*50*t);
y2 = 0.5*sin(2*%pi*500*t);
// y2 = 0.5*sin(2*%pi*500*t+%pi/4);
s=y1+y2+grand(1,N,'nor',0,1);
 
// Plot time-domain
endplot = round(N/15);
twoplots = scf(); // Set Current Figure (Graphics Window)
subplot(211);
plot(t(1:endplot),y1(1:endplot),t(1:endplot),y2(1:endplot));
subplot(212);
plot(t(1:endplot),y1(1:endplot)+y2(1:endplot));
 
y=fft(s);
ymax = max(abs(y));
y = y ./ ymax; // Normalize
 
// s is real so the fft response is conjugate symmetric
// and we retain only the first N/2 points
f=sample_rate*(0:(N/2))/N; //associated frequency vector
n=size(f,'*');
fftplots = scf();
plot(f(2:$),abs(y(2:n))); // drop first datapoint, f = 0 (it prevents log-plot)
a = gca();
a.log_flags = "lnn";

 

Best regards,

Claus

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users

 


_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users
Claus Futtrup Claus Futtrup
Reply | Threaded
Open this post in threaded view
|

Re: Simulating phase modulation

Hi Gary

Thanks for your input. I went the analytic route for now, and simplified a bit (as you often do with analytic solutions). You're right that from an electro-mechanical point of view, superposition applies, but as the waves transmit in acoustics in air - not, I'm afraid, this is where we see the distortion, simply because the speaker cone moves several millimeter.

Best regards,
Claus

On Sat, May 26, 2018 at 10:55 PM Gary Nelson <[hidden email]> wrote:

Claus,

Back in the late 60s, I did my PhD research using analytic signal. Yes,it works, and the implementation details are more complex that we find on the link. A few years ago, I implemented a system for analyzing harbor porpoise vocalizations using scilab. For example, instantaneous phase(t) wants to be differentiable if instantaneous frequency is to be positive. I found that octave bands are the widest that preserves this feature. Yes, you can calculate phase(t) = atan(imaginary/real), but you have to add 2PI when atan wraps around in order to make phase monotonically increase.

 

Also, I am not convinced that a loudspeaker does phase modulation.  Certainly, if the speaker is linear, then superposition applies. If phase modulation occurs, it is a non-linear effect. Perhaps that effect is real, but we need to see a model to show how it comes to be.

 

I might be able to help you write analytic signal  code.

 

Good wishes

Gary Nelson

 

 

Sent from my Windows 10 phone

 

From: [hidden email]
Sent: Saturday, May 26, 2018 7:41 AM
To: [hidden email]
Subject: Re: [Scilab-users] Simulating phase modulation

 

Hi Rafael

 

Thank you, I shall print and study. :-)

 

Cheers,

Claus

 

On Fri, May 25, 2018 at 8:42 PM Rafael Guerra <[hidden email]> wrote:

Hi Claus,

 

I am not aware of such function. However, you can find simple code here below for both phase modulation and demodulation, which is straightforward to translate in Scilab:

https://www.gaussianwaves.com/2017/06/phase-demodulation-using-hilbert-transform-application-of-analytic-signal/

 

Note that the phase modulation is coded differently from you snippet below.

 

Regards,

Rafael

 

From: users [mailto:[hidden email]] On Behalf Of Claus Futtrup
Sent: Friday, May 25, 2018 7:17 PM
To: International users mailing list for Scilab. <[hidden email]>
Subject: [Scilab-users] Simulating phase modulation

 

Hi there

 

In a loudspeaker the driver can move several millimeter in an attempt to reproduce a low-frequency note. If the speaker also at the same time produce a higher tone, this second tone is phase modulated by the first one. This is a distortion of the original signal which I'd like to simulate / illustrate with some simple Scilab code, if possible.

 

In Matlab this can be simulated with pmmod.

 

Is there a similar function in Scilab? (name - please ?)

 

Here's the code I have written so far - this is the part that shows the input signal (the un-distorted signal):

 

sample_rate=20000;
t = 0:1/sample_rate:0.6;
N=size(t,'*'); //number of samples
y1 = sin(2*%pi*50*t);
y2 = 0.5*sin(2*%pi*500*t);
// y2 = 0.5*sin(2*%pi*500*t+%pi/4);
s=y1+y2+grand(1,N,'nor',0,1);
 
// Plot time-domain
endplot = round(N/15);
twoplots = scf(); // Set Current Figure (Graphics Window)
subplot(211);
plot(t(1:endplot),y1(1:endplot),t(1:endplot),y2(1:endplot));
subplot(212);
plot(t(1:endplot),y1(1:endplot)+y2(1:endplot));
 
y=fft(s);
ymax = max(abs(y));
y = y ./ ymax; // Normalize
 
// s is real so the fft response is conjugate symmetric
// and we retain only the first N/2 points
f=sample_rate*(0:(N/2))/N; //associated frequency vector
n=size(f,'*');
fftplots = scf();
plot(f(2:$),abs(y(2:n))); // drop first datapoint, f = 0 (it prevents log-plot)
a = gca();
a.log_flags = "lnn";

 

Best regards,

Claus

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users

 

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users

_______________________________________________
users mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users