this script doesn't seem to work properly any more

조회 수: 3 (최근 30일)
Tom
Tom 2012년 4월 4일
I've been given this script to generate MLS sequences and until recently it was working okay. Now I get this error code - 'Warning: Data clipped during write to file:'
Here's the code: -
% MLS generator
%
% Warning! - this can take a very long time for large n
close all
clear all
for n=2:16; %order of mls sequence
N=2^n-1; %length of sequence
% Define taps:
b = zeros(n,1);
switch n
case 2
b([ 1 2]) = 1;
case 3
b([ 2 3]) = 1;
case 4
b([ 3 4]) = 1;
case 5
b([ 3 5]) = 1;
case 6
b([ 5 6]) = 1;
case 7
b([ 6 7]) = 1;
case 8
b([ 2 3 5 8]) = 1;
case 9
b([ 5 9]) = 1;
case 10
b([ 7 10]) = 1;
case 11
b([ 9 11]) = 1;
case 12
b([ 6 8 11 12]) = 1;
case 13
b([ 9 10 12 13]) = 1;
case 14
b([ 4 8 13 14]) = 1;
case 15
b([14 15]) = 1;
case 16
b([ 4 13 15 16]) = 1;
case 17
b([14 17]) = 1;
case 18
b([11 18]) = 1;
case 19
b([14 17 18 19]) = 1;
case 20
b([17 20]) = 1;
case 21
b([19 21]) = 1;
case 22
b([21 22]) = 1;
case 23
b([18 23]) = 1;
case 24
b([17 22 23 24]) = 1;
case 25
b([ 3 25]) = 1;
case 26
b([ 1 7 8 26]) = 1;
case 27
b([ 1 7 8 27]) = 1;
case 28
b([ 3 28]) = 1;
case 29
b([ 2 29]) = 1;
case 30
b([ 1 15 16 30]) = 1;
case 31
b([ 3 31]) = 1;
case 32
b([ 1 27 28 32]) = 1;
otherwise
error('taps only defined for m<=31');
end
a = zeros(n,1); % Latches
a(1) = 1; % Set latches with some starting values
for m=n+1:N % Sum of eqn 28, one state at a time module 0
% a(m) = mod( sum( flipud(a(m-n:m-1)).*b(2:n+1) ),2 );
a(m) = mod(sum(flipud(a(m-n:m-1)).*b),2);
end
c = 2*a-1; % The best way to check if the mls sequence in a is correct is to plot the autocorrelation
C = fft(c);
figure;
plot(round(real(ifft(C.*conj(C)))))
wavwrite(c,sprintf('mls_%d.wav',N))
end
Any help would be great.
  댓글 수: 2
Daniel Shub
Daniel Shub 2012년 4월 4일
Note that the best way to check for an mls sequence is not to plot the autocorrelation and inspect by eye. Also, it is unclear why if you know the taps you would want to plot every time.
Matt Fig
Matt Fig 2012년 11월 2일
Tom's question:
I've been given this script to generate MLS sequences and until recently it was working okay. Now I get this error code - 'Warning: Data clipped during write to file:'
Here's the code: -
% MLS generator
%
% Warning! - this can take a very long time for large n
close all
clear all
for n=2:16; %order of mls sequence
N=2^n-1; %length of sequence
% Define taps:
b = zeros(n,1);
switch n
case 2
b([ 1 2]) = 1;
case 3
b([ 2 3]) = 1;
case 4
b([ 3 4]) = 1;
case 5
b([ 3 5]) = 1;
case 6
b([ 5 6]) = 1;
case 7
b([ 6 7]) = 1;
case 8
b([ 2 3 5 8]) = 1;
case 9
b([ 5 9]) = 1;
case 10
b([ 7 10]) = 1;
case 11
b([ 9 11]) = 1;
case 12
b([ 6 8 11 12]) = 1;
case 13
b([ 9 10 12 13]) = 1;
case 14
b([ 4 8 13 14]) = 1;
case 15
b([14 15]) = 1;
case 16
b([ 4 13 15 16]) = 1;
case 17
b([14 17]) = 1;
case 18
b([11 18]) = 1;
case 19
b([14 17 18 19]) = 1;
case 20
b([17 20]) = 1;
case 21
b([19 21]) = 1;
case 22
b([21 22]) = 1;
case 23
b([18 23]) = 1;
case 24
b([17 22 23 24]) = 1;
case 25
b([ 3 25]) = 1;
case 26
b([ 1 7 8 26]) = 1;
case 27
b([ 1 7 8 27]) = 1;
case 28
b([ 3 28]) = 1;
case 29
b([ 2 29]) = 1;
case 30
b([ 1 15 16 30]) = 1;
case 31
b([ 3 31]) = 1;
case 32
b([ 1 27 28 32]) = 1;
otherwise
error('taps only defined for m<=31');
end
a = zeros(n,1); % Latches
a(1) = 1; % Set latches with some starting values
for m=n+1:N % Sum of eqn 28, one state at a time module 0
% a(m) = mod( sum( flipud(a(m-n:m-1)).*b(2:n+1) ),2 );
a(m) = mod(sum(flipud(a(m-n:m-1)).*b),2);
end
c = 2*a-1; % The best way to check if the mls sequence in a is correct is to plot the autocorrelation
C = fft(c);
figure;
plot(round(real(ifft(C.*conj(C)))))
wavwrite(c,sprintf('mls_%d.wav',N))
end
Any help would be great.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2012년 4월 4일
With double precision data and no number-of-bits parameter to wavwrite(), the warning means that the data in "c" is outside the range –1.0 <= c < +1.0 .
Your mod(a,2) with integral data can generate values that are 0 or 1. Multiply by 2 and subtract 1 and you get values -1 and 1 exactly. The -1 exactly is fine, but the +1 exactly is out of range for wavwrite() unless you use N of 32 bits.
  댓글 수: 4
Daniel Shub
Daniel Shub 2012년 4월 4일
It is possible you turned the warning off in your startup.m (or someplace else) and now the warning is on.
Tom
Tom 2012년 4월 5일
So do you think these MLS sequence wavs will still be usable? They do play, and sound like MLS sequences (white noise), but my Macbook won't recognise the duration of them.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Geoff
Geoff 2012년 4월 4일
A totally random aside... This script is also slow?
If you're repeating that switch statement thousands of times, why not put your indices into a cell:
idx = { [], [1 2], [2 3], [3 5], [5 6], ... };
Then in the loop:
b(idx{n}) = 1;
Also, your Latches preallocation surely should be size (N,1), not (n,1). That ought to make a huge difference, given how large N can be.
  댓글 수: 1
Tom
Tom 2012년 4월 5일
Thanks Geoff. That worked but I had to disable the
otherwise
error('taps only defined for m<=31');
line from the code for it to work.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Audio I/O and Waveform Generation에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

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

Start Hunting!

Translated by