4 views (last 30 days)

Show older comments

I am attemtping to recreate the m-file functions used by Zolzer in his Digital Audio Effects book. He has an M-file called symclip as shown below and I have included a recorded audio file to apply the clipping effect to. However, I cannot plot the output.

function y=symclip(x);

[x, fs] = audioread('E NOTE.wav');

% y=symclip(x)

% "Overdrive" simulation with symmetrical clipping

% x - input

N=length(x) ;

th=1/3; % threshold for symmetrical soft clipping

% by Schetzen Formula

for i = 1:N

if abs(x(i))< th, y(i)=2*x(i);end;

if abs(x(i))>=th,

if x(i)> 0, y(i)=(3-(2-x(i)*3) .^2)/3; end;

if x(i)< 0, y(i)=-(3-(2-abs(x(i))*3) .^2)/3; end;

end ;

if abs(x(i))>2*th,

if x(i)> 0, y(i)=1;end;

if x(i)< 0, y(i)=-1;end;

end ;

end;

plot(N, y)

Any help would be greatly appreciated

Pratyush Roy
on 12 May 2021

Hi Andrew,

According to the code, x is passed as the input argument to the function. However, according to the second line of the code, we get to know about the value x only after we have read the file usin audioread. So we can pass the name of the file as input to the function instead of the MATLAB array containing the sound intensity values.

Another change that can be made to the code is to use the command plot(1:N, y) instead of plot(N,y) since both the arguments for the plot function should be arrays whereas in the latter case it is a value N versus an array y.

You can refer to the code snippet below:

function y=symclip(filename)

[x, fs] = audioread(filename);

N=length(x) ;

th=1/3; % threshold for symmetrical soft clipping

% by Schetzen Formula

for i = 1:N

if abs(x(i))< th, y(i)=2*x(i);end;

if abs(x(i))>=th,

if x(i)> 0, y(i)=(3-(2-x(i)*3) .^2)/3; end;

if x(i)< 0, y(i)=-(3-(2-abs(x(i))*3) .^2)/3; end;

end ;

if abs(x(i))>2*th,

if x(i)> 0, y(i)=1;end;

if x(i)< 0, y(i)=-1;end;

end ;

end;

plot(1:N, y)

Hope this helps!

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

Start Hunting!