মতলবতে বাটারওয়ার্থ ফিল্টার ডিজাইন করা এবং অনলাইন ভেরিলোগ এইচডিএল কোড জেনারেটরের জন্য পূর্ণসংখ্যা হিসাবে ফিল্টার [অব] সহগফল অর্জন করা


15

আমি মতলব ব্যবহার করে খুব সাধারণ লো-পাস বাটারওয়ার্থ ফিল্টারটি ডিজাইন করেছি। নিম্নলিখিত কোড স্নিপেট আমি কী করেছি তা প্রদর্শন করে।

fs = 2.1e6;
flow = 44 * 1000;
fNorm =  flow / (fs / 2);
[b,a] = butter(10, fNorm, 'low');

[B, a] এ ফিল্টার সহগগুলি সংরক্ষণ করা হয়। আমি পূর্ণসংখ্যা হিসাবে [খ, এ] পেতে চাই যাতে ভেরিলোগে কোড উত্পন্ন করতে আমি একটি অনলাইন এইচডিএল কোড জেনারেটর ব্যবহার করতে পারি ।

মতলব [বি, এ] মানগুলি অনলাইন কোড জেনারেটরের সাথে ব্যবহার করার জন্য খুব ছোট বলে মনে হচ্ছে (সার্ভার-সাইড পার্ল স্ক্রিপ্ট সহগের সাথে কোড উত্পন্ন করতে অস্বীকার করেছে), এবং আমি ভাবছিলাম যে এটি [বি, ক] একটি ফর্ম যা সঠিক ইনপুট হিসাবে ব্যবহার করা যেতে পারে

মতলব-এ যে সহগগুলি পেয়েছি সেগুলি হ'ল:

1.0000
-9.1585
37.7780
-92.4225
148.5066
-163.7596
125.5009
-66.0030
22.7969
-4.6694
0.4307

আমি মাতলাবে যে খ সহগাঁটি পেয়েছি সেগুলি হ'ল:

1.0167e-012
1.0167e-011
4.5752e-011
1.2201e-010
2.1351e-010
2.5621e-010
2.1351e-010
1.2201e-010
4.5752e-011
1.0167e-011
1.0167e-012

অনলাইন জেনারেটরটি ব্যবহার করে, আমি 12-বিট বিটউইথ এবং আই বা II ফিল্টার ফর্ম সহ একটি ফিল্টার ডিজাইন করতে চাই। উপরের লিঙ্কটিতে "ভগ্নাংশ বিট" বলতে কী বোঝায় তা আমি জানি না।

উপরের তালিকাভুক্ত [b, a] সহগ সহ, কোড জেনারেটর (http://www.spiral.net/hardware/filter.html) চালানো, 20 এ বিভক্তিক বিট এবং 12 এর বিট প্রস্থ সহ, আমি নিম্নলিখিত রান ত্রুটিটি পেয়েছি :

Integer A constants: 1048576 -9603383 39613104 -96912015 155720456 -171714386 131597231 -69209161 23904282 -4896220 451621
Integer B constants: 0 0 0 0 0 0 0 0 0 0 0

Error: constants wider than 26 bits are not allowed, offending constant = -69209161, effective bitwidth = 7 mantissa + 20 fractional = 27 total.

An error has occurred - please revise the input parameters. 

আমি কীভাবে আমার নকশাটি পরিবর্তন করতে পারি যাতে এই ত্রুটি না ঘটে?

আপডেট: মাতলাব ব্যবহার করে 6th ষ্ঠ-অর্ডার বাটারওয়ার্থ ফিল্টার উত্পন্ন করতে আমি নিম্নলিখিত সহগগুলি পেয়েছি:

একটি জন্য:

1.0000
-5.4914
12.5848
-15.4051
10.6225
-3.9118
0.6010 

খ জন্য:

0.0064e-005
0.0382e-005
0.0954e-005
0.1272e-005
0.0954e-005
0.0382e-005
0.0064e-005

অনলাইন কোড জেনারেটর চালানো (http://www.spiral.net/hardware/filter.html), আমি এখন নিম্নলিখিত ত্রুটিটি পেয়েছি (8 এর বিচ্ছিন্ন বিট এবং 20 এর বিটউইথ সহ):

./iirGen.pl -A 256  '-1405' '3221' '-3943' '2719' '-1001' '153' -B  '0' '0' '0' '0' '0' '0' '0' -moduleName acm_filter -fractionalBits 8 -bitWidth 20 -inData inData  -inReg   -outReg  -outData outData -clk clk -reset reset -reset_edge negedge -filterForm 1  -debug  -outFile ../outputs/filter_1330617505.v 2>&1 
At least 1 non-zero-valued constant is required.  Please check the inputs and try again.

সম্ভবত বি-সহগ বা খুব কম, বা সম্ভবত কোড জেনারেটর (http://www.spiral.net/hardware/filter.html) [b, a] কে অন্য ফর্ম্যাটে চায়?

হালনাগাদ:

সম্ভবত আমাকে যা করতে হবে তা হল পূর্ণসংখ্যক হিসাবে গুণফলগুলি পাওয়ার জন্য ভগ্নাংশ বিটের সংখ্যা দ্বারা [b, a] সহগগুলি scale

a .* 2^12
b .* 2^12

যাইহোক, আমি এখনও মনে করি যে খ সহগগুলি খুব ছোট। আমি এখানে কি ভুল করছি?

সম্ভবত অন্য ধরণের ফিল্টার (বা ফিল্টার ডিজাইন পদ্ধতি) আরও উপযুক্ত হবে? কেউ পরামর্শ দিতে পারে?

আপডেট: নীচের মন্তব্যে জেসন আর এবং ক্রিস্টোফার ফেল্টনের পরামর্শ অনুসারে, একটি এসওএস ফিল্টার আরও উপযুক্ত হবে। আমি এখন কোনও এসওএস ফিল্টার পাওয়ার জন্য কিছু মাতলাব কোড লিখেছি।

fs = 2.1e6;
flow = 44 * 1000;      
fNorm =  flow / (fs / 2);
[A,B,C,D] = butter(10, fNorm, 'low');
[sos,g] = ss2sos(A,B,C,D);

আমি যে এসওএস ম্যাট্রিক্স পাই তা হ'ল:

1.0000    3.4724    3.1253    1.0000   -1.7551    0.7705
1.0000    2.5057    1.9919    1.0000   -1.7751    0.7906
1.0000    1.6873    1.0267    1.0000   -1.8143    0.8301
1.0000    1.2550    0.5137    1.0000   -1.8712    0.8875
1.0000    1.0795    0.3046    1.0000   -1.9428    0.9598

এই এসওএস ফিল্টারটি বাস্তবায়নের জন্য এখনও ভেরিলোগ কোড জেনারেশন টুল (http://www.spiral.net/hardware/filter.html) ব্যবহার করা সম্ভব, বা আমি কেবল হাতে হাতে ভেরিলোগটি লিখতে পারি? একটি ভাল রেফারেন্স পাওয়া যায়?

আমি ভাবব যদি এফআইআর ফিল্টার এই পরিস্থিতিতে ব্যবহার করা ভাল।

মুভিভার: পুনরাবৃত্ত আইআইআর ফিল্টারগুলি সহগফলকে ভগ্নাংশ হিসাবে প্রকাশ করে পূর্ণসংখ্যার গণিত ব্যবহার করে প্রয়োগ করা যেতে পারে। (আরও তথ্যের জন্য স্মিথের দুর্দান্ত ডিএসপি সিগন্যাল প্রসেসিং বইটি দেখুন: http://www.dspguide.com/ch19/5.htm )

নিম্নলিখিত মাতলাব প্রোগ্রাম মাটলাব ইঁদুর () ফাংশনটি ব্যবহার করে বাটারওয়ার্থ ফিল্টার সহগকে ভগ্নাংশে রূপান্তরিত করে। তারপরে মন্তব্যে উল্লিখিত হিসাবে, দ্বিতীয় অর্ডার বিভাগগুলি ফিল্টারটি সংখ্যায় প্রয়োগ করতে ব্যবহার করা যেতে পারে (http://en.wikedia.org/wiki/ ডিজিটাল_বিক্যাড_ফিল্টার))

% variables
% variables
fs = 2.1e6;                     % sampling frequency           
flow = 44 * 1000;               % lowpass filter


% pre-calculations
fNorm =  flow / (fs / 2);       % normalized freq for lowpass filter

% uncomment this to look at the coefficients in fvtool
% compute [b,a] coefficients
% [b,a] = butter(7, fNorm, 'low');
% fvtool(b,a)  

% compute SOS coefficients (7th order filter)
[z,p,k] = butter(7, fNorm, 'low');

% NOTE that we might have to scale things to make sure
% that everything works out well (see zp2sos help for 'up' and 'inf' options)
sos = zp2sos(z,p,k, 'up', 'inf'); 
[n,d] = rat(sos); 
sos_check = n ./ d;  % this should be the same as SOS matrix

% by here, n is the numerator and d is the denominator coefficients
% as an example, write the the coefficients into a C code header file
% for prototyping the implementation

 % write the numerator and denominator matices into a file
[rownum, colnum] = size(n);  % d should be the same
sections = rownum;           % the number of sections is the same as the number of rows
fid = fopen('IIR_coeff.h', 'w');

fprintf(fid, '#ifndef IIR_COEFF_H\n');
fprintf(fid, '#define IIR_COEFF_H\n\n\n');
for i = 1:rownum
   for j = 1:colnum

       if(j <= 3)  % b coefficients
            bn = ['b' num2str(j-1) num2str(i) 'n' ' = ' num2str(n(i,j))];
            bd = ['b' num2str(j-1) num2str(i) 'd' ' = ' num2str(d(i,j))];
            fprintf(fid, 'const int32_t %s;\n', bn);
            fprintf(fid, 'const int32_t %s;\n', bd);

       end
       if(j >= 5)  % a coefficients
            if(j == 5) 
                colstr = '1'; 
            end
            if(j == 6) 
                colstr = '2'; 
            end
            an = ['a' colstr num2str(i) 'n' ' = ' num2str(n(i,j))];
            ad = ['a' colstr num2str(i) 'd' ' = ' num2str(d(i,j))];
            fprintf(fid, 'const int32_t %s;\n', an);
            fprintf(fid, 'const int32_t %s;\n', ad);
       end
   end
end

% write the end of the file
fprintf(fid, '\n\n\n#endif');
fclose(fid);

4
এই জাতীয় উচ্চতর অর্ডার আইআইআর ফিল্টারগুলি সাধারণত দ্বিতীয়-ক্রম বিভাগগুলি ব্যবহার করে প্রয়োগ করা হয় ; আপনি একাধিক সেকেন্ড-অর্ডার পর্যায়ে ক্যাসকেড করে আপনি যে ফিল্টারটি চান তা পেতে পারেন (পছন্দসই অর্ডার বিজোড় হলে একক প্রথম-অর্ডার স্টেজ সহ)। এটি সাধারণত উচ্চ-অর্ডার ফিল্টারটি বাস্তবায়নের চেয়ে আরও দৃ implementation় বাস্তবায়ন।
জেসন আর

3
@ জেসনআর পরামর্শ দেয় আপনি যদি তা না করেন তবে আপনার খুব বড় শব্দের আকার থাকবে। মৌলিক আইআইআর কাঠামো প্রয়োগ করা হলে এর মতো ফিল্টারগুলি একক নির্ভুলতা ভাসমান পয়েন্ট ব্যর্থ করতে পারে, আপনার এসওএস প্রয়োজন need
ক্রিস্টোফার ফেল্টন

@ জেসনআর: এটি প্রস্তাব দেওয়ার জন্য আপনাকে ধন্যবাদ। আমি উপরের উত্তর দ্বারা আপডেট করেছি।
নিকোলাস কিনার

@ ক্রিস্টোফেলফেল্টন: এটি আরও জোরদার করতে সহায়তা করার জন্য আপনাকে ধন্যবাদ।
নিকোলাস কিনার

হ্যাঁ আপনার নতুন এসওএস ম্যাট্রিক্সের সাহায্যে আপনি সাইট থেকে 3 টি ফিল্টার তৈরি করতে পারেন। অথবা আপনি আমার কোডটি এখানে ব্যবহার করতে পারেন । এটি ওয়েবসাইটের মতোই কাজ করবে। আমি আনন্দের সাথে স্ক্রিপ্টটি এসওএস ম্যাট্রিক্স বাদে আপডেট করব।
ক্রিস্টোফার ফেলটন

উত্তর:


5

আলোচিত হিসাবে বিভাগগুলির যোগফলটি ব্যবহার করা ভাল, এটি হ'ল অর্ডার ফিল্টারকে একটি ক্যাসকেডযুক্ত ২ য় অর্ডার ফিল্টারগুলিতে ভেঙে দেয়। আপডেট হওয়া প্রশ্নের মধ্যে এসওএস ম্যাট্রিক্স রয়েছে। এই কোড এবং এখানে একটি উদাহরণ ব্যবহার করে করে পাইথন অবজেক্টটি পৃথক বিভাগগুলি তৈরি করতে ব্যবহার করা যেতে পারে।

মতলব-এ

save SOS

পাইথনে

import shutil
import numpy
from scipy.io import loadmat
from siir import SIIR

matfile = loadmat('SOS.mat')  
SOS = matfile['SOS']
b = numpy.zeros((3,3))
a = numpy.zeros((3,3))
section = [None for ii in range(3)]
for ii in xrange(3):
    b[ii] = SOS[ii,0:3]
    a[ii] = SOS[ii,3:6]

    section[ii] = SIIR(b=b[ii], a=a[ii], W=(24,0))
    section[ii].Convert()  # Create the Verilog for the section
    shutil.copyfile('siir_hdl.v', 'iir_sos_section%d.v'%(ii))

নির্দিষ্ট পয়েন্ট সম্পর্কিত অতিরিক্ত তথ্য এখানে পাওয়া যাবে


অন্তর্দৃষ্টিযুক্ত লিঙ্কগুলির জন্য এবং পাইথন কোডের জন্য আপনাকে অনেক ধন্যবাদ; আমি আশা করি যে আপনার উত্তর (এবং এখানে পোস্ট করা অন্যান্য উত্তর) আরও অনেকের পক্ষে ভাল রেফারেন্স হিসাবে কাজ করবে। আমি আশা করি যে আমি এখানে সমস্ত প্রতিক্রিয়া স্বীকৃত হিসাবে চিহ্নিত করতে পারি।
নিকোলাস কিনার

1
আপনার যদি কোনও সমস্যা থাকে তবে আমাকে জানান এবং কোডটি আপনার পক্ষে কাজ না করে আমি আপডেট / ঠিক করব। আমি সরাসরি একটি এসওএস ম্যাট্রিক্স গ্রহণ করার জন্য এটি (অপেক্ষাকৃত শীঘ্রই, দোহ) পরিবর্তন করব।
ক্রিস্টোফার ফেল্টন

1
আমি আপনার উদাহরণ থেকে আমার নিজস্ব সংস্করণ প্রয়োগ করার চেষ্টা করেছি। আমার সিস্টেমে আমাকে "নম্পি আমদানি শূন্য থেকে" ব্যবহার করতে হবে এবং লোটম্যাটটি লোডমেটে () পরিবর্তন করতে হবে। প্রত্যাশার মতো একই ফরম্যাটে ম্যাট্লাব ( mathworks.com/help/toolbox/signal/ref/ss2sos.html ) দ্বারা সরবরাহ করা এসওএস ম্যাট্রিক্স কি ? এসওএস ম্যাট্রিক্স অ্যাক্সেস করার চেষ্টা করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: "টাইপআরার: অনিবার্য টাইপ" যখন দোভাষী "বি [ii] = এসওএস [0: 3, ii]" লাইনে পৌঁছে যায়
নিকোলাস কিনার

1
এটি SOS.mat ফাইলের ফর্ম্যাটের উপর নির্ভর করবে। আপনি যদি কেবল >>> মুদ্রণ (ম্যাটফিল) করেন তবে এটি আপনাকে বোঝানো .mat ফাইলের কীগুলি দেখায়। Scipy.io.loadmat সর্বদা অভিধান (BOMK) হিসাবে লোড হয়।
ক্রিস্টোফার ফেলটন

1
হ্যাঁ, এটি সঠিক, 0 এর আউটপুট 1 এবং তাই আরও ইনপুট। শব্দের প্রস্থে একটু চিন্তাভাবনা করা দরকার। ডিফল্ট হ'ল দুটি ব্যবহার 24 বিট ভগ্নাংশ (0 পূর্ণসংখ্যা, 23 ভগ্নাংশ, 1 চিহ্ন)। আমি বিশ্বাস করি আপনি মূলত একটি ছোট শব্দ প্রস্থ ব্যবহার করতে চেয়েছিলেন।
ক্রিস্টোফার ফেল্টন

10

'ভগ্নাংশ বিটস' একটি বাসের বিটের সংখ্যা যা আপনি কোনও সংখ্যার ভগ্নাংশের অংশকে উপস্থাপন করতে উত্সর্গ করেছিলেন (যেমন, 3.75-এ .75)।

বলুন যে আপনি একটি ডিজিটাল বাস 4 বিট প্রস্থ, কি সংখ্যা আছে 1001 উপস্থাপন করে? আপনি যদি এটি ইতিবাচক পূর্ণসংখ্যার হিসাবে বিবেচনা করেন তবে এটি '9' এর অর্থ হতে পারে (2 ^ 3 + 2 ^ 0 = 8 + 1 = 9)। বা এর দুটিটির পরিপূরক স্বরলিপিতে -7 অর্থ হতে পারে: (-2 ^ 3 + 2 ^ 0 = -8 + 1 = -7)।

তাদের মধ্যে কিছু ভগ্নাংশের সংখ্যার অর্থাত্ 'আসল' সংখ্যাগুলি কী? আসল সংখ্যাগুলি হার্ডওয়্যারে "ফিক্সড পয়েন্ট" বা "ভাসমান পয়েন্ট" হিসাবে উপস্থাপন করা যেতে পারে। দেখে মনে হচ্ছে those ফিল্টার জেনারেটরগুলি নির্দিষ্ট পয়েন্ট ব্যবহার করে।

আমাদের 4 বিট বাসে ফিরে ( 1001)। আসুন একটি বাইনারি পয়েন্ট চালু করি যাতে আমরা পাই 1.001। এর অর্থ কী তা হল যে এখন পয়েন্টটির আরএইচএসে বিটগুলি পূর্ণসংখ্যা তৈরি করতে এবং এলএইচএসে বিটগুলি ভগ্নাংশ তৈরি করতে ব্যবহার করা হয়েছিল। ডিজিটাল বাস সেট দ্বারা প্রতিনিধিত্ব করা সংখ্যাটি 1.0011.125 ( 1* 2 ^ 0 + 0* 2 ^ -1 + 0* 2 ^ -2 +1 * 2 ^ -3 = 1 + 0.125 = 1.125)। এই ক্ষেত্রে, বাসের 4 টি বিটের মধ্যে আমরা একটি সংখ্যার ভগ্নাংশের অংশটি উপস্থাপন করতে এর মধ্যে 3 টি ব্যবহার করছি। অথবা, আমাদের কাছে 3 ভগ্নাংশ বিট রয়েছে।

সুতরাং যদি আপনার উপরে উপরে যেমন বাস্তব সংখ্যার একটি তালিকা থাকে তবে আপনাকে এখন সিদ্ধান্ত নিতে হবে যে আপনি কতগুলি ভগ্নাংশ বিটগুলি উপস্থাপন করতে চান। এবং এখানে বাণিজ্য বন্ধ: আপনি যত বেশি ভগ্নাংশ বিট ব্যবহার করবেন, আপনি যতটা সংখ্যক চান তার তত বেশি পরিমাণ উপস্থাপন করতে পারবেন তবে আপনার সার্কিটটি আরও বড় হওয়া দরকার। এবং আরও কী, আপনি যত কম ভগ্নাংশ বিট ব্যবহার করবেন, ফিল্টারটির প্রকৃত ফ্রিকোয়েন্সি প্রতিক্রিয়া আপনার প্রারম্ভিক নকশা করা একটি থেকে বিচ্যুত হবে!

এবং বিষয়টিকে আরও খারাপ করার জন্য আপনি একটি অসীম ইমপ্লাস রেসপন্স (আইআইআর) ফিল্টারটি সন্ধান করছেন। যদি আপনার পর্যাপ্ত ভগ্নাংশ এবং পূর্ণসংখ্যার বিট না থাকে তবে এগুলি আসলে অস্থির হয়ে উঠতে পারে!


এই অন্তর্দৃষ্টিপূর্ণ উত্তর প্রদান করার জন্য ধন্যবাদ। আমি উপরের ছোট বি সহগ ব্যবহার করে কোড জেনারেটর চালানোর চেষ্টা করেছি এবং এখনও আমি কিছু ত্রুটি পেয়েছি। জেনারেটরটি সঠিকভাবে চালানোর জন্য আমি কি কিছু করতে পারি? আমি কি করেছি তা দেখানোর জন্য উপরের উত্তরটি আপডেট করব।

10

সুতরাং মার্টি বিটস প্রশ্নটি ভালভাবে যত্ন নিয়েছে। ফিল্টার নিজেই, আমি মনে করি আপনি খারাপ মাপা মাপের সহগ সম্পর্কে মাতলাব থেকে একটি সতর্কতা বা অভিযোগ পেয়েছেন? যখন আমি ফিল্টারটি প্লট করি, স্কিপি থেকে মাতলাব নয় তবে সম্ভবত এটি খুব একই রকম।

প্রতিক্রিয়া

যা পাসব্যান্ডে 100 ডিবি ডাউন! সুতরাং, আপনি এটি নিশ্চিত করতে চাইতে পারেন যে আপনি একটি ছোট অর্ডার ফিল্টার চান, যা আপনাকে যাইহোক বাস্তবায়নে সহায়তা করবে। আমি যখন 6th ষ্ঠ অর্ডার ফিল্টারে পৌঁছাচ্ছি তখন আমি খারাপ সহগগুলির সম্পর্কে অভিযোগ পাওয়া বন্ধ করি। সম্ভবত অর্ডার হ্রাস করার চেষ্টা করুন এবং দেখুন এটি এখনও আপনার প্রয়োজনীয়তা পূরণ করে কিনা।


এটি পরামর্শ দেওয়ার জন্য ধন্যবাদ! আমি মনে করি যে 6th ষ্ঠ অর্ডার ফিল্টার ঠিক একইভাবে কাজ করবে। মতলব এর fvtool ব্যবহার করে, আমি মনে করি যে আমার আবেদনের জন্য প্রতিক্রিয়া ভাল। আমি এখন উপরে আমার প্রতিক্রিয়া আপডেট করেছি। যাইহোক, ভেরিলোগ এইচডিএল কোড জেনারেটরের ( সর্পিল.এনএইচআরডওয়্যার / ফিল্টার এইচটিএমএল ) সাথে এখনও কিছু ভুল হচ্ছে । সম্ভবত এটি [বি, এ] অন্য ফর্ম্যাটে চায়। তদ্ব্যতীত, SciPy ব্যবহারের জন্য +1।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.