کلیدستان

نسخه‌ی کامل: quantization
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام دوستان این کد واسه uniform quantizaton هست که اجرا نمیشه و رو خط قرمزش ارور میده کسی میتونه کمکم کنه؟
%quantization a sound signal
function []=demo_quant(inname,outname,N);
if nargin <3
disp('usageConfusedample_quant(inname,outname,N)');
disp('inname:input .wav file name');
disp('outname:output .wav file name');
disp('N:quantization leve, N>1');
return;
end;
%read in input signal
[x,Fs,N0]=wavread(inname);
xmin=min(x);
xmax=max(x);
Q=(xmax-xmin)/N
disp('N0,xmin,xmax,N,Q');
disp([N0,xmin,xmax,N,Q]);
%apply uniform quantization on each sample


xq=sign(x).*(floor((abs(x)+Q/2)/Q)*Q);

%compare sound quality

wavwrite(xq,Fs,N0,outname);
sound(x,Fs);
pause;
sound(xq,Fs);
%plot waveform over the entire period
t=1:length(x);
figure;plot(t,x,'r:');
hold on; plot(t,xq,'b-');
axis tight; grid on;

%plot waveform over a selected period
t=5000:5100;
figure;plot(t,x(5000:5100),'r:');
hold on; plot(t,xq(5000:5100),'b-');
axis tight; grid on;

end
سلام.
نگاهی به کدها انداختم. بهتره اول به صورت مرتب، کل کدها رو نمایش بدم :

کد:
%quantization a sound signal
function []=demo_quant(inname,outname,N);
if nargin <3
    disp('usage:sample_quant(inname,outname,N)');
    disp('inname:input .wav file name');
    disp('outname:output .wav file name');
    disp('N:quantization leve, N>1');
    return;
end;
%read in input signal
[x,Fs,N0]=wavread(inname);
xmin=min(x);
xmax=max(x);
Q=(xmax-xmin)/N
disp('N0,xmin,xmax,N,Q');
disp([N0,xmin,xmax,N,Q]);
%apply uniform quantization on each sample


xq=sign(x).*(floor((abs(x)+Q/2)/Q)*Q);

%compare sound quality

wavwrite(xq,Fs,N0,outname);
sound(x,Fs);
pause;
sound(xq,Fs);
%plot waveform over the entire period
t=1:length(x);
figure;plot(t,x,'r:');
hold on; plot(t,xq,'b-');
axis tight; grid on;

%plot waveform over a selected period
t=5000:5100;
figure;plot(t,x(5000:5100),'r:');
hold on; plot(t,xq(5000:5100),'b-');
axis tight; grid on;

end

گفته بودید خطا رو برای این خط از کدها میده :

کد:
xq=sign(x).*(floor((abs(x)+Q/2)/Q)*Q);

خود کدنویسی این خط مشکلی نداره. اما من متاسفانه نتونستم برنامه رو اجرا کنم تا چک کنم مشکل از چی هست، چون نمیدونستم که تابع تعریف شده به چه ورودی نیاز داره. شما لطفا ورودی لازم برای این برنامه (این تابع) رو بنویسید تا بعد من با اون برنامه رو اجرا کنم.
در ضمن، متن خطا را هم بنویسید (به طور کامل).
به این صورت run کنید :

کد:
demo_quant00('dog1.wav','d.wav',5)
dog1.wav=internal sound
d.wav=output sound

خطا :

کد:
Error using  +
Matrix dimensions must agree.

Error in demo_quant00 (line 20)
xq=sign(x).*(floor((abs(x)+Q/2)/Q)*Q);
ارسالتون رو ویرایش کردم، لطفا تنها به فارسی بنویسید.

ابتدا باید تذکر بدم که demo_quant00 غلط است و نام تابع demo_quant می باشد.
بنابراین طبق گفته شما باید کدهای زیر را اجرا کنیم :

کد:
demo_quant('dog1.wav','d.wav',5)
dog1.wav=internal sound
d.wav=output sound

ولی پیام خطای زیر را می دهد :

کد:
??? Error using ==> wavread at 67
Cannot open file.

Error in ==> demo_quant at 11
[x,Fs,N0]=wavread(inname);

چون ترتیب کدها را اشتباه گفتید و باید dog1.wav و d.wav ، قبلا از ارجاع به تابع تعریف شوند.
حالا این بار این کدها رو اجرا می کنیم :

کد:
dog1.wav=internal sound
d.wav=output sound
demo_quant('dog1.wav','d.wav',5)

که پیام خطای زیر را می دهد :

کد:
??? dog1.wav=internal sound
                      |
Error: Unexpected MATLAB expression.

خواهشمندم با صبوری بیشتری کدهای مربوط به نحوه اجرای تابع را بنویسید (ابتدا در نرم افزار متلب خودتان تست کنید).
بله حق با شماست
ببينيد اين خطا بخاطر اينه که شما اون فايل ورودي را نداريد.ببنيد يه فايل با پسوند wav در همون مسيري که فايل متلبتون هست کپي کنيد و به عنوان ورودي همون فايل رو معرفي کنيد
من نميدونم اينجا چطور مي تونم فايل آپلود کنم وگرنه خودم براتون ميذاشتم
ورودي دوم هم که شما فقط اسمشو مينوسين وبرنامه در همون مسير ايجادش ميکنه
عدد آخر هم گامهاي کوانتيزاسيونه که هر عددي ميتونه باشه
يه چيز ديگه
من اون دو خط رو براي توضيح نوشتم شمابراي اجرا فقط همين خط رو بنويسيد

کد:
demo_quant('dog1.wav','d.wav',5)
کدهای متلب تصحیح شده، به صورت زیر می باشند :

کد:
%quantization a sound signal
function []=demo_quant(inname,outname,N);
if nargin <3
    disp('usage:sample_quant(inname,outname,N)');
    disp('inname:input .wav file name');
    disp('outname:output .wav file name');
    disp('N:quantization leve, N>1');
    return;
end;
%read in input signal
[x,Fs,N0]=wavread(inname);
xmin=min(x);
xmax=max(x);
Q=(xmax-xmin)/N
disp('N0,xmin,xmax,N,Q');
disp([N0,xmin,xmax,N,Q]);
%apply uniform quantization on each sample

x_size=size(x);
xq=x;
for nn=1:x_size(1)
    for mm=1:x_size(2)
        xq(nn,mm)=sign(x(nn,mm))*(floor((abs(x(nn,mm))+Q(mm)/2)/Q(mm))*Q(mm));
    end
end

%compare sound quality

wavwrite(xq,Fs,N0,outname);
sound(x,Fs);
pause;
sound(xq,Fs);
%plot waveform over the entire period
t=1:length(x);
figure;plot(t,x,'r:');
hold on; plot(t,xq,'b-');
axis tight; grid on;

%plot waveform over a selected period
t=5000:5100;
figure;plot(t,x(5000:5100),'r:');
hold on; plot(t,xq(5000:5100),'b-');
axis tight; grid on;

end

که در آن، خط زیر :

کد:
xq=sign(x).*(floor((abs(x)+Q/2)/Q)*Q);

را به کدهای زیر تبدیل کرده ایم (برای رفع مشکل) :

کد:
x_size=size(x);
xq=x;
for nn=1:x_size(1)
    for mm=1:x_size(2)
        xq(nn,mm)=sign(x(nn,mm))*(floor((abs(x(nn,mm))+Q(mm)/2)/Q(mm))*Q(mm));
    end
end

مشکل هم از این موضوع ناشی میشد که Q دارای دو مقدار می باشد (به دلیل اینکه x دارای دو ستون است). به هر حال با کدهای بالا دیگر این مشکل ایجاد نمی شود.

برنامه رو اجرا کردم و دیگر پیام خطا نمایش داده نشد.
دقت کنید که در میان کدها، دستور pause نوشته شده و باید بعد از شنیدن فایل صوتی اول، کلید enter از کیبورد را بزنید تا ادامه برنامه اجرا گردد.

موفق باشید. Smile
ممنونم از راهنماییتون
من خودم آن قسمت از کد را که خطا میداد به صورت زیر اصلاح کردم و خطا رفع شد

کد:
for count=1:length(x)
temp = sign(x(count))*(   floor((abs(x(count))+ Q/2)/Q)*Q   );
xq(count,1)= temp(1);      
xq(count,2)= temp(2);      
end

حالا بین کد شما و خودم مرددم!!!
بنظرتون این کد اشتباهه؟
البته هر دو برنامه خروجی یکسان دارند!
ولی نمی دونم تا چه حد این تغییراتی که ایجاد کردیم در تغییر نتیجه کد اصلی تاثیر میذاره!!!
از نظر شما این کدها دقیقا معادل هم هستند؟ و من خیالم راحت باشه؟
(۱۳۹۲/۰۴/۳۱, ۰۱:۴۳ ب.ظ)s24ranjbar نوشته: [ -> ]ممنونم از راهنماییتون
من خودم آن قسمت از کد را که خطا میداد به صورت زیر اصلاح کردم و خطا رفع شد

کد:
for count=1:length(x)
temp = sign(x(count))*(   floor((abs(x(count))+ Q/2)/Q)*Q   );
xq(count,1)= temp(1);      
xq(count,2)= temp(2);      
end

حالا بین کد شما و خودم مرددم!!!
بنظرتون این کد اشتباهه؟

نه این کد غلطه، بنابراین خروجی کد من و کد شما برابر نخواهد بود.
باید از دستور size استفاده می کردید نه دستور length و بعد تعداد ردیف x ، برابر عنصر اول خروجی می بود. همچنین نشانه گذاری زیر رو هم :

کد:
x(count)

باید به این نشانه گذاری تغییر می دادین :

کد:
x(count,:)

در کل کد شما به تغییراتی نیاز داره، ولی اون کدی که براتون نوشتم بهتره و از همون استفاده کنید.
ممنونم
یه سوال دیگه
لطفا ببنید تبدیل فرمول زیر درسته:

کد:
y=xmax*log10(1+abs(x)*(mu/xmax))/log10(1+mu);

به

کد:
x_size=size(x);
xq=x;
for nn=1:x_size(1)
    for mm=1:x_size(2)
         y=xmax(mm)*log10(1+abs(x(nn,mm))*(mu/xmax(mm)))/log10(1+mu);
    end
end

همون برنامه قبلی را در نظر بگیرید که عبارتش تغییر کرده باشه
ممنون
(۱۳۹۲/۰۴/۳۱, ۰۸:۱۲ ب.ظ)s24ranjbar نوشته: [ -> ]یه سوال دیگه
لطفا ببنید تبدیل فرمول زیر درسته:

کد:
y=xmax*log10(1+abs(x)*(mu/xmax))/log10(1+mu);

به

کد:
x_size=size(x);
xq=x;
for nn=1:x_size(1)
    for mm=1:x_size(2)
         y=xmax(mm)*log10(1+abs(x(nn,mm))*(mu/xmax(mm)))/log10(1+mu);
    end
end

همون برنامه قبلی را در نظر بگیرید که عبارتش تغییر کرده باشه
ممنون

بله درسته.

فقط گفتم یک نکته رو تذکر بدم که دستور max وقتی برای ماتریسی با چند ستون به کار میره، ماکزیمم هر ستون را بر می گرداند و بنابراین دو مقدار نتیجه شده برای ماکزیمم x ، ممکنه در ردیف های متفاوتی از x قرار داشته باشند، نه در یک ردیف.

مثلا کد متلب زیر :

کد:
x=[1 6;3 4;5 2]
x_max=max(x)

این نتیجه رو میده :

کد:
x =

     1     6
     3     4
     5     2

x_max =

     5     6

به خاطر این توضیح دادم، که برخی دوستان چنین اشتباهی می کنن، ولی من نمیدونم کدوم حالت مد نظر شما بوده. (البته تبدیل بالا که گفتید درسته و من منظورم روی مرحله تعیین ماکزیمم x می باشد).
ممنونم