Jump to content

    

Самурай

Участник
  • Content Count

    643
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Самурай

  • Rank
    Знающий

Контакты

  • ICQ
    Array

Recent Profile Visitors

6660 profile views
  1. Для ДПФ/БПФ в предварительной фильтрации в данном случае нет никакого смысла. Разумеется, если все операции делать на даблах/флоатах. 4500*8/60 = 600Гц. Разве нет? Ниже часть спектра для hilda_250kHz_rpm_low, 100к отсчетов, по оси х частота в Гц. Хорошо виден пик как раз на 600Гц. Это хорошая новость. Плохая новость в том, что этих пиков там как.... Много в общем. А самое скверное, что по амплитуде они не очень то сильно и отличаются. Совершенно не очевидно, что пик на 600Гц, это та самая искомая частота... И еще пара нюансов: 1. Если сигнал не выпрямлять перед оцифровкой, то количество пиков будет существенно меньше. 2. Явно не хватает разрядности АЦП.
  2. А вот спектр по 100к отсчетам с некоторым смещением по времени:
  3. Вот часть спектра для сигнала hilda_50kHz_rpm_high.txt. Просто тупо FFT по всему сигналу, без всяких предварительных обработок. Ну и где здесь искомая частота, пропорциональная оборотам?:) Пусть даже без учета леса гармоник от 100Гц...
  4. Микрон их делает. Но у Микрона сайт г...но, только поиском и только упоминание о них и можно найти.
  5. К сожалению, сейчас нет возможности самому все проверить в Матлабе, но есть возможность проанализировать исходники ф-и comm.FMBroadcastDemodulator... Всю ф-ю приводить не буду, только самое интересное. Итак, вот код, непосредственно отвечающий за основной функционал: function [yAudio, yRBDS] = stepImpl(obj,u) x = complex(u); % Complex inflation yDemod = obj.pFMDemod(x); % FM Demodulation % Intermediate rate conversion to 228 kHz if ~obj.pLegacyMode || obj.RBDS yDemodIntermediate228 = obj.pRateConv228(yDemod); end if obj.pLegacyMode % Intermediate rate conversion to 152 kHz (legacy mode) for backwards % compatibility yDemodIntermediate152 = obj.pRateConv152(yDemod); end % Construct needed reference tones at 19 kHz, 38 kHz, 57 kHz if obj.Stereo || obj.RBDS % Get 19 kHz pilot tone at Fs = 228 kHz if ~obj.pLegacyMode || obj.RBDS pilotSin19_228 = obj.pBandPass19_228(yDemodIntermediate228); end if obj.pLegacyMode pilotSin19_152 = obj.pBandPass19_152(yDemodIntermediate152); end if obj.pLegacyMode % Construct 38 kHz pilot tone from the 19 kHz pilot tone: refToneSin38 = obj.getRefTone152(pilotSin19_152); if obj.RBDS % Construct 57 kHz pilot tone from the 19 kHz pilot tone: [~, refToneCos57] = obj.getRefTones228(pilotSin19_228); end else % Construct 38 and 57 kHz pilot tone from 19 kHz pilot tone: [refToneSin38 , refToneCos57] = obj.getRefTones228(pilotSin19_228); end end %%%%%% Основной алгоритм декодирования и восстановления стерео-сигнала: %%%%%%%%%% % Low pass filter to isolate L+R (Mono): if obj.pLegacyMode leftPlusRight = obj.pLowPass(yDemodIntermediate152); else leftPlusRight = obj.pLowPass(yDemodIntermediate228); end if obj.Stereo % coherent AM demodulation with 38 kHz carrier: leftMinusRight = refToneSin38 .* obj.pBandPass38(leftPlusRight); y1 = [leftPlusRight, leftMinusRight]; % [L+R, L-R] % Output [L R]: yAudioIntermediate = [y1(:, 1)+y1(:, 2), y1(:, 1)-y1(:, 2)]; else % Mono (L+R) yAudioIntermediate = leftPlusRight; end if obj.RBDS ... end % De-emphasis yFilt = obj.pDeEmphFilter(yAudioIntermediate); % Rate conversion from intermediate sample rate (228/152 kHz) to AudioSampleRate yAudio = obj.pAudioRateConv(yFilt); % Play using audio device if obj.PlaySound obj.pAudio(yAudio); end end Все достаточно прозрачно, единственный нюанс, что после ЧМ-демодулятора, частота дискретизации понижается до промежуточной частоты 152кГц или 228кГц (в зависимости от каких-то мутных условий), на которой и идет вся дальнейшая обработка. Частоты удобны тем, что они кратны 19кГц, 38кГц и 57кГц, которые вовсю используются для стерео-кодирования. Дальше полосовым фильтром выделяется пилотный тон 19кГц, из которого формируются опорные частоты 38 и 57 кГц. Потом ФНЧ с частотой среза 15кГц выделяет L+R канал, т.е. все как на картинке из описания на ф-ю: А вот потом для режима "Стерео" начинается что-то необъяснимое: вместо вполне разумного для канала L-R маршрута: вх.сигнал -> ПФ 38кГц -> умножение на несущую -> ФНЧ 15кГц, в коде лично я вижу лютый бред: через ПФ на 38кГц пропускается не входной сигнал, а сигнал, полученный после ФНЧ на 15кГц, т.е канал L+R, в котором после этих самых 15кГц все задавлено в ноль!:))) На этом фоне упоминать, что для канала L-R забыли ФНЧ на 15кГц, наверно уже нет смысла...:) Посчитав, что этого недостаточно, разработчики данной ф-и решили подстраховаться и разбросали по коду еще немного сюрпризов: 1. В коде в разнобой используются как FIR, так и IIR фильтры. 2. Задержки FIR фильтров никак не компенсируются и не учитываются. 3. Разумеется, задержки IIR фильтров тоже считаются нулевыми. 4. ФНЧ на 15кГц для канала L+R сделан FIR-ом, а вот ПФ на 38кГц для канала L-R уже IIR! Ну и разумеется, см. пп.2 и пп.3:))) 5. Пилотный тон 19кГц для когерентной демодуляции L-R канала выделяется IIR фильтром! И да, см. пп.3:) 6. Все IIR фильтры сделаны 50-ого порядка!!! Но это ладно, рука у человека дрогнула, бывает, но они захардкодены в виде коэффициентов, причем все коэффициенты имеют всего лишь 4 знака после запятой, вот примерно вот так: 0.9997, 0.9998, 0.9998 0.9999... И это для IIR 50-ого порядка, пусть даже разбитого на секции 2-ого порядка???:))) 7. ... Заранее извиняюсь, если что-то напутал, все-таки суббота вечер, да еще и август:)
  6. Только это фильтр нечетного порядка.
  7. Только все-таки на половину длины фильтра... Точнее, для фильтра нечетного порядка на (длина-1)/2
  8. Это не совсем так, даже в идеальном случае на нулевой частоте у фильтра Гильберта АЧХ = 0. А для дискретного фильтра Гильберта нечетного порядка АЧХ = 0 еще и на Fs/2. Иными словами - фильтр Гильберта это как минимум ФВЧ, а то и вовсе ПФ. Возможно. Я могу взять вещественный сигнал, например, синус с частотой 1кГц и дискретизацией 8кГц, пропустить его через фильтр Гильберта и получить на выходе опять же вещественный сигнал, но уже косинус 1кГц. Разумеется, косинусом он будет только по отношению к входному синусу, задержанному на задержку в фильтре Гильберта. А вот что я получу, если: я не знаю:)
  9. Да, это то. Только есть одна небольшая проблема - фильтр Гильберта для Fs = 8кГц и с полосой пропускания от 5Гц будет иметь приблизительно 2000-й порядок. Это если конечно у Вас на скриншоте не опечатка и Fs на самом деле не 8кГц а 8МГц (если судить из "все гармоники в спектре от 5 Гц до 2000 КГц"). Тогда все несколько хуже:) И это еще смотря сколько в цифрах вот это вот "чтобы (почти) не менялась", а то порядок может и подрасти:) Вы лучше раскройте Вашу тайну и скажите что нужно получить в конечном итоге. Из чего и для чего. А дальше народ подтянется и может быть окажется, что и никакого Гильберта и не надо вовсе:) Ну и конечно то, что: делает задачу слегка малореализуемой, даже для Fs = 8кГц...
  10. Reducing sidelobes by weighting functions. Ну и все, что ниже по тексту.
  11. Неудачная шутка, прошу прощения. Пытался обратить внимание, что про первый боковой лепесток уместно говорить только для огибающей АКФ, т.к. еще есть и ВЧ заполнение...
  12. Но есть нюанс - это верно только для комплексного chirp-а:)
  13. Терзают некоторые сомнения меня... Во всяком случае на модели я разницу не вижу, ну если только в третьем знаке после запятой...
  14. Вот тут народ много чего разбирает и фотки выкладывает, в том числе осциллографы. Вот Siglent SDS2000X, к примеру. Просто первое, что попалось. Но что там можно увидеть, когда все самое вкусное на спец. ASIC-е сделано, даже уже у китайцев?:)