Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Вниз

Частота   Найти похожие ветки 

 
Sergo   (2002-04-24 13:08) [0]

Как можно получить частоту входного сигнала на звукаху?


 
VictorT   (2002-04-24 13:21) [1]

С амплитудой разобрался?

Формула для частоты:
f = 1/T,
где Т - период.
Чтобы определить период, я думаю можно замерять время между соседними локальными максимумами. Если опять выразился непонятно, приведу текст программы.


 
Sergo   (2002-04-24 13:29) [2]

>VictorT ©
Спасибо что опять откликнулся. Да с амплитудой я разобрался.
Формула для частоты:
f = 1/T,
где Т - период.

Эту формулу я знаю, а вот с замером времени... если не трудно напиши код.
А через БПФ нельзя узнать?


 
VictorT   (2002-04-24 13:46) [3]

Не знаю, что такое БПФ :(

Сейчас ухожу на обед, код напишу чуть позже.


 
Sergo   (2002-04-24 13:48) [4]

БПФ это быстрое преобразование фурье


 
Digitman   (2002-04-24 14:38) [5]

Вот сиди тут и думай, о какой "частоте" ты речь ведешь ...
БПФ как раз есть первое , что можно рекомендовать. Ты ж ничего не сказал о заведомо определенной АЧХ анализируемого сигнала : сложный сигнал или нет, меняется спектр во времени или нет, периодически или апериодически ... Может, это вообще - "белый шум" ? Тогда задача нерешаемая.


 
Sergo   (2002-04-24 15:28) [6]

>Digitman ©
Сигнал предполагается практически неизменным во времени по амплитуде и частоте, но все же эти параметры могут меняться, спонтанно.


 
AFROLOV   (2002-04-24 15:41) [7]

Надо не промахнуться с частотой дискретизации при снятии АЧХ - посмотри "Теорема Котельникова". Иначе можно получить кучу мусора (при низкой частоте дискретизации) или много лишних данных (при высокой) - как следствие очень большое время обработки.


 
Digitman   (2002-04-24 15:41) [8]

>Sergo

Какой частоте-то ? Какой гармоники ? Если гармоник нет, можно и без БПФ обойтись. Иначе задача сводится к определению частоты осн.тона сигнала, имеющего постоянный спектр.состав, а это как раз и дает повод как минимум для применения БПФ


 
VictorT   (2002-04-24 15:50) [9]

Да, после написаного тут наверное надо погодить с кодом, вначале получше разобраться с проблемой.


 
Sergo   (2002-04-24 15:54) [10]

>Digitman ©
Частота в диапазоне 50 Гц +-10гц, гармоник: в лучшем случае одна, в худшем 3, количество гармоник я контролировать (они также возникают спонтанно) не могу, но мне их нужно отследить.


 
Sergo   (2002-04-24 15:55) [11]

Сигнал моно 8бит, частота дискретизации 22,5 кГц.


 
VictorT   (2002-04-24 15:56) [12]

Да, кстати, гляньте сюда:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1018853239&n=3
всё ли там в порядке, а то в свете вышенаписаного сомнения возникли.


 
Sergo   (2002-04-24 15:59) [13]

> VictorT ©
А зачем туда смотреть?


 
AFROLOV   (2002-04-24 16:02) [14]

Для надежного разделения сигналов с близкими частотами необходим большой периуд наблюдения.


 
Sergo   (2002-04-24 16:04) [15]

>AFROLOV ©
Насколько большой?


 
VictorT   (2002-04-24 16:07) [16]


> А зачем туда смотреть?

Да подумал, что тот метод может не подходить.


 
Sergo   (2002-04-24 16:13) [17]

>VictorT ©
Да меня тоже берут сомнения, можно попробовать загонять данные за кокайто промежуток времени в массив и искать там максимальное значение (to all это у нас с VictorT © маленькое "лирическое" отступление от темы :))


 
AFROLOV   (2002-04-24 16:20) [18]

Надо формулы посмотреть - я так не помню. Но чем ближе частоты тем больше должен быть периуд наблюдения.<=> Чем больше периуд наблюдения тем более близкие по частоте сигналы можно достоверно разделить.=> Преуд наблюдения выбирается из следующих соображений:
1. Минимальной разности частот между 2 сигналами, которые считаются разными.
2. Других соображений(скорость обработки, и т.д.)

Кстати, увеличение частоты дискретизации в разделении сигналов тебе не поможет.


В любой приличной книжке по обработке сигналов это есть.


 
Digitman   (2002-04-24 16:25) [19]

>Sergo
Если 50Гц и гармоник не более 2-х, что мешает тебе установить частоту дискретизации, равной, скажем, 4кГц ? При такой частоте дискретизации БПФ при минимальных ресурсах системы вполне справится со своей задачей в real-time !


 
Sergo   (2002-04-24 16:26) [20]

>AFROLOV ©
Спасибо
Но разделение сигналов не суть. Пойдем по легкому пути будем считать, что гармоника одна :)).
Но проблема так и не решилась :((. Как узнать частоту?


 
VictorT   (2002-04-24 16:26) [21]

Посмотрел теорему Котельникова, если правильно понял, то частота дискретизации в данном случае должна быть 120 Гц.


 
Sergo   (2002-04-24 16:30) [22]

Digitman ©
Я думал об этом. У меня есть готовый алгоритм БПФ, его мне дал HeadHanter (одно время он находился здесь, а счас че то не видать) вот его код:
А где здесь частота я че то не найду :((
unit dsp;


interface

type
TWaveHeader = record
Marker1: Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2: Array[0..3] of Char;
Marker3: Array[0..3] of Char;
Fixed1: LongInt;
FormatTag: Word;
Channels: Word;
SampleRate: LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample: Word;
Marker4: Array[0..3] of Char;
DataBytes: LongInt;
end;



procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:LongInt);
procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single;N:LongInt);


implementation

function Power2(lPower: Byte): LongInt;

begin
Result := 1 Shl lPower;
end;


procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSumR : single;
var dSumI : single;
begin
for lGarm := 0 to N div 2 - 1 do begin
dSumR := 0;
dSumI := 0;
for lSrch := 0 to N - 1 do begin
try dSumR := dSumR + aSignal[lSrch] * Cos(lGarm * lSrch / N * 2 * PI);
except end;
try dSumI := dSumI + aSignal[lSrch] * Sin(lGarm * lSrch / N * 2 * PI);
except end;
end;
aSpR[lGarm] := dSumR;
aSpI[lGarm] := dSumI;
end;
end;

procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSum : single;
begin

for lSrch := 0 to N-1 do begin
dSum := 0;
for lGarm := 0 to N div 2 -1
do dSum := dSum + aSpR[lGarm] * cos(lSrch * lGarm * 2 * Pi / N)
+ aSpI[lGarm] * sin(lSrch * lGarm * 2 * Pi / N);

aSignal[lSrch] := dSum/n;
end;
end;


end.


 
Sergo   (2002-04-24 16:36) [23]

>VictorT ©
Да ты прав, по теореме частота дискретизации должна вдвое превышать частоту входного сигнала. Но можно ли выставить такую частоту?


 
Sergo   (2002-04-24 16:57) [24]

Ну че мне делать то :((


 
VictorT   (2002-04-24 17:04) [25]


> Но можно ли выставить такую частоту?

Я думаю, что просто програмно делать задержку и в нужный момент опрашивать звуковуху.


 
Sergo   (2002-04-24 17:06) [26]

VictorT ©
Счас попробовал, у меня сразу буфер переполняется и прога виснет, а и вообще мне это ничего не дает.


 
AFROLOV   (2002-04-24 17:17) [27]

Не совсем так. Согласно теореме Котельникова частота должна быть не менеечем в 2 раза больше - т.е. не менее 120 Гц. Если у тебя была больше - отлично. Просто ты сразу о параметрах сигнала ничего не сказал.


 
Sergo   (2002-04-24 17:20) [28]

Как же высчитать частоту?


 
AFROLOV   (2002-04-24 17:35) [29]

Взять любую больше 120 Гц и при которой твоя прога успевает данные обрабатывать.


 
VictorT   (2002-04-24 18:20) [30]

Наверное скоро ухожу, так что приведу код, а вы уж без меня решите, подходит он или нет. Я там пообзывал некоторые функции, думаю догадаешься, что имелось в виду.

int value;
int value1 = 0;
int T = GetTime();
while(условие продолжения цикла) {
value = GetSignal();
if (value1 > value) {
Label1->Caption = FloatToStr(GetTime() - T);
T = GetTime();
}
value1 = value;
Wait();
}



 
Sergo   (2002-04-25 07:54) [31]

>AFROLOV ©
Я поставил частоту дискретизации 22,5. А как узнать частоту входного сигнала?


 
Sergo   (2002-04-25 09:58) [32]

HELP!!!


 
Digitman   (2002-04-25 10:10) [33]

22.5кГц - это оч.много для 50Гц.
11кГц - еще куда не шло. Но, насколько мне известно, SB-совместимые карты позволяют выставлять и иные ЧД. Если драйвер карты это позволяет, задай ЧД в диапазоне от 1кгц до 4кГц.

Вот смотри, какой д.б. ход рассуждений и расчетов в данной задаче.
Предположим, ЧД = 1кГц., а ширина фрейма (ШФ, по сути - периодичность измерения вх.сигнала) = 1 сек. При 8-битном монорежиме оцифровки запись длительностью в ШФ секунд потребует 1кб буферной памяти. При этом в буфер будет записана инф-ция о ~ 50-ти периодах вх.сигнала. Это означает, что в полученном при прямом БПФ спектре сигнал частотой в ~ 50 раз превышающей частоту 1Гц (~ 1 / ШФ) , будет представлен ~ 50-й его гармоникой. Амплитуда 50-й гармоники (при том, что вх.сигнал, как ты говоришь, близок к синусоидальному) будет резко отличаться (в общем случае - иметь максимальное значение) от амплитуд прочих гармоник.

Исходя из этого, можно выбрать след.параметры вызова ClassicDirect() :
- aSignal - адрес собственно буфера фрейма;
- размер буфера фрейма N = 1024 (степень двойки !!! на этом базируется вся механика БПФ);
- M = 53 (50 + 3) (выбираемый размер массивов aSpR, aSpI; фактически M - это верхний частотный предел спектра, выше которого частотный анализ нас не интересует в дан.случае)

Результатом работы БПФ будут два заполненных массива aSpR и aSpI, содержащих соотв-но действительные и мнимые составляющие комплексных значений амплитуд упорядоченных (по возрастанию их номеров) гармоник в спектре фрейма вх.сигнала.
Абс. значение ампл-ды k-й гармоники может быть расчитано как aSp[k] = Sqrt(aSpR[k] ^ 2 + aSpI[k] ^ 2). При предполагаемой центральной частоте вх.сигнала ~ 50Гц, можно, проанализировав тем или иным образом некий результ.массив aSp[1..M] (в котором записаны расчитанные по этой формуле абс.зн-я амплитуд гармоник), убедиться, что индекс k максимального элемента массива aSp будет равен 50, что при заданной нами ШФ ~ 1сек. и дает как раз частоту осн.тона сигнала Fвх равной ~50 Гц.

Умешьшив ШФ, к примеру, в 2 раза (ШФ ~ 0.5 сек) для уменьшения периода измерения и, соотв-но, размеров буфера фрейма и массивов aSp, aSpR, aSpI для той же Fвх ~ 50 Гц мы получим иное значение k ~ 50 / 2 ~ 25, но при этом точность измерения, разумеется, понижается из-за особенностей БПФ, связанных с возможностью разложения сигнала в спектр, состоящий только из гармоник с целочисленными номерами.


 
Sergo   (2002-04-25 11:20) [34]

У меня родилась идея и я хотел бы посоветоваться:
Я набираю в массив за период времени в 1 сек. значения синусоиды, ищу средених максимальное (амплитудное). Далее считаю количество амплитудных значений за этот период времени - это и будет частота. Конечно от realtime я буду немного отставать.


 
Digitman   (2002-04-25 11:51) [35]

>Sergo
Слишком велика будет погрешность и частота сильно "скакать" будет от измерения к измерению. Если вообще получишь правильный результат - гармоники-то возможны, сам же говоришь. Чтобы сие "прокатило", нужно будет содержимое буфера фрейм "прогонять" через ФНЧ перед этим подсчетом, дабы свести до допустимого минимума влияние тех самых гармоник на безошибочность и "плавность" результата. А ФНЧ еще и дополнительную задержку внесет. Плюс - неоптимальность/неэффективность самого алгоритма подсчета (как, впрочем, и в случае с БПФ по приведенному тобой алгоритму в ClassicDirect) : ни MMX ни XMM не используются, а могли бы дать не менее чем 4-хкратное увеличение производительности сквозного тракта программного анализа сигнала.
Поэтому - так или иначе - по-любому рекомендую воспользоваться для своей задачи готовыми реализациями тех или иных выбранных тобой алгоритмов в библиотеке Intel Signal Processing Library v4.x (IntelSPL). Если, конечно, планируешь работу задачи на CPU от Intel. Мощь MMX- и XMM-технологий там задействована "на полную катушку". Есть там все : и векторно/матричные вычисления, и фильтры, и FFT - все, что душе угодно).. Есть в пакете с iSPL и оч.неплохой Делфи5-демо-проект (редкость вообще !), демонстрирующий визуально практически всю функц-ть библиотеки.


 
Sergo   (2002-04-25 12:03) [36]

>Digitman ©
Пожалуйта подскажи не битую ссылку на IntelSPL, я много слышал о ней но никак не могу закачать ее.


 
Digitman   (2002-04-25 12:18) [37]

http://downloadfinder.intel.com/scripts-df/Product_Filter.asp?ProductID=238

работает, проверено только что.


 
Sergo   (2002-04-25 13:10) [38]

>Digitman ©
спасибо


 
Sergo   (2002-04-25 15:32) [39]

>Digitman ©
У меня дельфовая демка ругается на nsp.dll не знаешь в чем может быть дело, система ХР?


 
Digitman   (2002-04-25 16:20) [40]

>Sergo

И как ругается ?



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.007 c
6-7146
DriveT
2002-03-21 22:06
2002.06.03
Порт сканер помогите плз...


14-7230
Efremoff
2002-04-29 09:05
2002.06.03
компиляция пакета delphi 5 в delphi 6


14-7189
Lord Warlock
2002-04-22 14:17
2002.06.03
Чуть более сложно


4-7273
alexru
2002-03-29 20:44
2002.06.03
Как следить за изменениями в реестре


14-7196
IronHawk
2002-04-26 13:11
2002.06.03
Админам посвящаеться :-))))





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский