انجمن سایت کلیدستان


رتبه موضوع:
  • 1 رای - 3 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
quantization

quantization

#1
سلام دوستان این کد واسه 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

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

کد:
%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);

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

quantization

#3
به این صورت 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);
پاسخ

quantization

#4
ارسالتون رو ویرایش کردم، لطفا تنها به فارسی بنویسید.

ابتدا باید تذکر بدم که 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.

خواهشمندم با صبوری بیشتری کدهای مربوط به نحوه اجرای تابع را بنویسید (ابتدا در نرم افزار متلب خودتان تست کنید).
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط bubrenula

quantization

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

کد:
demo_quant('dog1.wav','d.wav',5)
پاسخ

quantization

#6
کدهای متلب تصحیح شده، به صورت زیر می باشند :

کد:
%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
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

quantization

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

کد:
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

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

quantization

#8
البته هر دو برنامه خروجی یکسان دارند!
ولی نمی دونم تا چه حد این تغییراتی که ایجاد کردیم در تغییر نتیجه کد اصلی تاثیر میذاره!!!
از نظر شما این کدها دقیقا معادل هم هستند؟ و من خیالم راحت باشه؟
پاسخ

quantization

#9
(۱۳۹۲/۰۴/۳۱, ۰۱:۴۳ ب.ظ)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,:)

در کل کد شما به تغییراتی نیاز داره، ولی اون کدی که براتون نوشتم بهتره و از همون استفاده کنید.
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

quantization

#10
ممنونم
پاسخ
 سپاس شده توسط admin ، bubrenula

quantization

#11
یه سوال دیگه
لطفا ببنید تبدیل فرمول زیر درسته:

کد:
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

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

quantization

#12
(۱۳۹۲/۰۴/۳۱, ۰۸:۱۲ ب.ظ)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 می باشد).
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

quantization

#13
ممنونم
پاسخ
 سپاس شده توسط admin ، شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان